Пример #1
0
 public InstructionSet(TemperatureInstruction temp, TimeInstruction t, TeaInstruction tea, FilterInstruction filter)
 {
     this.time        = t;
     this.tea         = tea;
     this.filter      = filter;
     this.temperature = temp;
 }
Пример #2
0
        public void UserGetsQuestion_1ScenNoAns_False()
        {
            UserTiming timingRun = new UserTiming();

            LinkedQuestion q = new LinkedQuestion();

            q.VarName.RefVarName = "AA001";

            FilterInstruction fi = new FilterInstruction();

            fi.VarName = "AA000";
            fi.Oper    = Operation.Equals;
            fi.ValuesStr.Add("1");

            List <FilterInstruction> filterList = new List <FilterInstruction>();

            filterList.Add(fi);
            q.FilterList.Add(filterList);

            Respondent r = new Respondent();

            r.Description = "Test Respondent";


            Assert.IsFalse(timingRun.UserGetsQuestion(r, q));
        }
        /// <remarks>
        /// Ideas from https://stackoverflow.com/questions/5094489
        /// </remarks>
        private Expression <Func <TItem, bool> > GetFilterPredicateExpression(FilterInstruction filterInstruction)
        {
            if (!_fieldProvider.FieldExists(filterInstruction.FieldName))
            {
                throw new FieldNotFoundException(filterInstruction.FieldName, false);
            }

            IFieldCollator <TItem> fieldCollator = _fieldProvider.GetCollator(filterInstruction.FieldName);

            if (fieldCollator == null)
            {
                throw new FieldOperationNotAllowedException(filterInstruction.FieldName, FieldOperation.Filter);
            }

            try
            {
                ParameterExpression itemPram = Expression.Parameter(typeof(TItem), "fltr");

                Expression filterExpression = fieldCollator.GetFilterExpression(itemPram, filterInstruction.Operator, filterInstruction.ValueString);
                if (filterExpression == null)
                {
                    throw new ArgumentNullException(nameof(filterExpression), "No filter expression was defined for this field.");
                }

                Expression <Func <TItem, bool> > predicateLambda = Expression.Lambda <Func <TItem, bool> >(filterExpression, itemPram);
                return(predicateLambda);
            }
            catch (Exception ex)
            {
                throw new FieldCannotFilterException(filterInstruction.FieldName, ex);
            }
        }
Пример #4
0
        public void RespondentFailsSingleTerm()
        {
            LinkedQuestion q = new LinkedQuestion();

            q.PreP = "Ask if AA001=1.";

            List <FilterInstruction> fl = new List <FilterInstruction>();

            FilterInstruction fi = new FilterInstruction()
            {
                VarName = "AA001",
                Oper    = Operation.Equals
            };

            fi.ValuesStr.Add("1");

            fl.Add(fi);

            q.FilterList.Add(fl);

            ITCLib.Respondent r = new ITCLib.Respondent();

            r.AddResponse("AA001", "2");


            Assert.IsFalse(r.RespondentSatisfiesFilter(fl));
        }
Пример #5
0
        public void RespondentSatisfiesTwoTerm()
        {
            List <FilterInstruction> fl = new List <FilterInstruction>();

            FilterInstruction fi = new FilterInstruction()
            {
                VarName = "AA001",
                Oper    = Operation.Equals
            };

            fi.ValuesStr.Add("1");

            FilterInstruction fi2 = new FilterInstruction()
            {
                VarName = "AA002",
                Oper    = Operation.Equals
            };

            fi2.ValuesStr.Add("1");

            fl.Add(fi);
            fl.Add(fi2);



            Respondent r = new Respondent();

            r.AddResponse("AA001", "1");
            r.AddResponse("AA002", "1");

            Assert.IsTrue(r.RespondentSatisfiesFilter(fl));
        }
Пример #6
0
        public bool QuestionHasFilter(LinkedQuestion lq, FilterInstruction fi)
        {
            bool hasFilter = false;

            if (fi.ValuesStr.Count() == 0)
            {
                return(false);
            }


            string fiValue = fi.ValuesStr[0];

            foreach (List <FilterInstruction> list in lq.FilterList)
            {
                if (fiValue.Length == 1 && char.IsLetter(Char.Parse(fiValue)))
                {
                    // check for letter-type response (C or P usually)
                    if (list.Any(x => x.VarName.Equals(fi.VarName) && x.ValuesStr.Contains(fiValue)))
                    {
                        hasFilter = true;
                        break;
                    }
                }

                else
                {
                    if (list.Any(x => x.Oper == Operation.Equals && x.VarName.Equals(fi.VarName) && x.ValuesStr.Contains(Int32.Parse(fiValue).ToString())))
                    {
                        hasFilter = true;
                        break;
                    }
                    else if (list.Any(x => x.Oper == Operation.NotEquals && x.VarName.Equals(fi.VarName) && !x.ValuesStr.Contains(Int32.Parse(fiValue).ToString())))
                    {
                        hasFilter = true;
                        break;
                    }
                    else if (list.Any(x => x.Oper == Operation.GreaterThan && x.VarName.Equals(fi.VarName) && x.ValuesStr.Any(y => Int32.Parse(y) < Int32.Parse(fiValue))))
                    {
                        // check if fiValue is less than all list values
                        hasFilter = true;
                        break;
                    }
                    else if (list.Any(x => x.Oper == Operation.LessThan && x.VarName.Equals(fi.VarName) && x.ValuesStr.Any(y => Int32.Parse(y) > Int32.Parse(fiValue))))
                    {
                        // check if fiValue is greater than all list values
                        hasFilter = true;
                        break;
                    }
                }
            }

            return(hasFilter);
        }
Пример #7
0
        public void Answer_NotSatisfiesFilterInstructionGreater()
        {
            Answer a = new Answer("AA000", "1");

            FilterInstruction fi = new FilterInstruction();

            fi.VarName = "AA000";
            fi.ValuesStr.Add("2");
            fi.Oper = Operation.GreaterThan;

            Assert.IsFalse(a.SatisfiesFilter(fi));
        }
Пример #8
0
        //
        // TODO this doesn't take into account <> > <
        /// <summary>
        /// For a given filter instruction, get the list of VarNames that use it as a filter
        /// </summary>
        /// <param name="fi"></param>
        /// <returns></returns>
        public List <LinkedQuestion> GetDirectFilterConditionList(FilterInstruction fi)
        {
            List <LinkedQuestion> vars = new List <LinkedQuestion>();

            foreach (LinkedQuestion lq in Questions)
            {
                if (QuestionHasFilter(lq, fi))
                {
                    vars.Add(lq);
                }
            }
            return(vars);
        }
Пример #9
0
        public void Answer_SatisfiesFilterInstructionNotEqual()
        {
            Answer a = new Answer("AA000", "1");

            FilterInstruction fi = new FilterInstruction();

            fi.VarName = "AA000";
            fi.Oper    = Operation.NotEquals;
            fi.ValuesStr.Add("2");


            Assert.IsTrue(a.SatisfiesFilter(fi));
        }
Пример #10
0
        public bool QuestionHasIndirectFilter(LinkedQuestion lq, FilterInstruction fi)
        {
            bool hasFilter = false;

            // if any of lq's filters has the filter, add it to the result
            foreach (LinkedQuestion q in ListFilters(lq))
            {
                if (QuestionHasFilter(q, fi))
                {
                    hasFilter = true;
                    break;
                }
            }
            return(hasFilter);
        }
Пример #11
0
        private string GetDirectFilterListColumn(LinkedQuestion lq, List <LinkedQuestion> directFilterList)
        {
            string filterExpList = "";
            // for each response in this lq, create a filter instruction and get the list of varnames that fall under it
            var resps = lq.GetRespNumbers();

            foreach (string response in resps)
            {
                Dictionary <string, string> filterExpressions = new Dictionary <string, string>();

                FilterInstruction fi = new FilterInstruction();
                fi.VarName = lq.VarName.RefVarName;
                fi.Oper    = Operation.Equals;
                fi.ValuesStr.Add(response);
                fi.FilterExpression = fi.VarName + "=" + fi.ValuesStr[0];

                // for each direct varname, get its filter in regard to this varname
                foreach (LinkedQuestion dlq in directFilterList)
                {
                    string filterExp = dlq.GetFilterExpression(fi);

                    filterExpressions.Add(dlq.VarName.RefVarName + "(" + dlq.Weight.Value + " - " + dlq.Weight.Source + ")", filterExp);
                }

                //
                foreach (string f in filterExpressions.Values)
                {
                    if (filterExpList.Contains(f))
                    {
                        continue;
                    }

                    filterExpList += "[lblue]<strong>" + f + "</strong>[/lblue]\r\n";
                    foreach (string k in filterExpressions.Keys)
                    {
                        if (filterExpressions[k].Equals(f))
                        {
                            filterExpList += k + "\r\n";
                        }
                    }

                    filterExpList += "\r\n";
                }
            }
            return(filterExpList);
        }
Пример #12
0
        public SurveyTiming(string xmlDoc)
        {
            XmlDocument runData = new XmlDocument();

            runData.LoadXml(xmlDoc);
            SurveyCode = runData.SelectSingleNode("/SurveyTiming").Attributes["Survey"].InnerText;
            Title      = runData.SelectSingleNode("/SurveyTiming").Attributes["RunTitle"].InnerText;
            TotalTime  = Double.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["Mins"].InnerText) * 60;
            WPM        = Int32.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["WPM"].InnerText);
            StartQ     = Int32.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["StartQ"].InnerText);
            Notes      = runData.SelectSingleNode("/SurveyTiming").Attributes["Notes"].InnerText;

            foreach (XmlNode q in runData.SelectNodes("/SurveyTiming/Questions/Question"))
            {
                LinkedQuestion lq = new LinkedQuestion();

                lq.VarName.FullVarName = q.Attributes["VarName"].InnerText;
                lq.VarName.RefVarName  = q.Attributes["refVarName"].InnerText;
                lq.VarName.VarLabel    = q.Attributes["VarLabel"].InnerText;
                lq.Qnum = q.Attributes["Qnum"].InnerText;

                lq.PreP = q.Attributes["PreP"].InnerText;
                lq.PreI = q.Attributes["PreI"].InnerText;
                lq.PreA = q.Attributes["PreA"].InnerText;
                lq.LitQ = q.Attributes["LitQ"].InnerText;
                lq.PstI = q.Attributes["PstI"].InnerText;
                lq.PstP = q.Attributes["PstP"].InnerText;
                try
                {
                    lq.RespName = q.Attributes["RespName"].InnerText;
                }
                catch (Exception)
                {
                    lq.RespName = "0";
                }
                lq.RespOptions = q.Attributes["RespOptions"].InnerText;
                lq.NRCodes     = q.Attributes["NRCodes"].InnerText;


                lq.Weight.Value  = double.Parse(q.Attributes["Weight"].InnerText);
                lq.Weight.Source = q.Attributes["WeightSource"].InnerText;

                // filter scenarios
                foreach (XmlNode scenarios in q.SelectNodes("/Scenarios"))
                {
                    List <FilterInstruction> list = new List <FilterInstruction>();

                    foreach (XmlNode scenario in scenarios.SelectNodes("/Scenario/FilterInstruction"))
                    {
                        FilterInstruction fi = new FilterInstruction();
                        fi.VarName = scenario.Attributes["VarName"].InnerText;
                        switch (scenario.Attributes["Operation"].InnerText)
                        {
                        case "Equals":
                            fi.Oper = Operation.Equals;
                            break;

                        case "NotEquals":
                            fi.Oper = Operation.NotEquals;
                            break;

                        case "GreaterThan":
                            fi.Oper = Operation.GreaterThan;
                            break;

                        case "LessThan":
                            fi.Oper = Operation.LessThan;
                            break;
                        }

                        foreach (XmlNode resps in scenario.SelectNodes("/Responses/Response"))
                        {
                            fi.ValuesStr.Add(resps.Attributes["ResponseValue"].InnerText);
                        }
                        list.Add(fi);
                    }
                    lq.FilterList.Add(list);
                }

                Questions.Add(lq);
            }
        }
Пример #13
0
 private void CreateNewMatchCondition()
 {
     _currentFilterInstruction = new FilterInstruction();
     //_scenarios.Add(_currentFilterInstruction);
 }
Пример #14
0
        public UserTiming(string xmlDoc)
        {
            XmlDocument runData = new XmlDocument();

            runData.LoadXml(xmlDoc);
            SurveyCode = runData.SelectSingleNode("/SurveyTiming").Attributes["Survey"].InnerText;
            Title      = runData.SelectSingleNode("/SurveyTiming").Attributes["RunTitle"].InnerText;
            TotalTime  = Double.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["Mins"].InnerText) * 60;
            WPM        = Int32.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["WPM"].InnerText);
            StartQ     = Int32.Parse(runData.SelectSingleNode("/SurveyTiming/Time").Attributes["StartQ"].InnerText);
            Notes      = runData.SelectSingleNode("/SurveyTiming").Attributes["Notes"].InnerText;

            Questions = new List <LinkedQuestion>();

            foreach (XmlNode q in runData.SelectNodes("/SurveyTiming/Questions/Question"))
            {
                LinkedQuestion lq = new LinkedQuestion();

                lq.VarName.FullVarName = q.Attributes["VarName"].InnerText;
                lq.VarName.RefVarName  = q.Attributes["refVarName"].InnerText;
                lq.VarName.VarLabel    = q.Attributes["VarLabel"].InnerText;
                lq.Qnum = q.Attributes["Qnum"].InnerText;

                lq.PreP        = q.Attributes["PreP"].InnerText;
                lq.PreI        = q.Attributes["PreI"].InnerText;
                lq.PreA        = q.Attributes["PreA"].InnerText;
                lq.LitQ        = q.Attributes["LitQ"].InnerText;
                lq.PstI        = q.Attributes["PstI"].InnerText;
                lq.PstP        = q.Attributes["PstP"].InnerText;
                lq.RespName    = q.Attributes["RespName"].InnerText;
                lq.RespOptions = q.Attributes["RespOptions"].InnerText;
                lq.NRCodes     = q.Attributes["NRCodes"].InnerText;


                lq.Weight.Value  = double.Parse(q.Attributes["Weight"].InnerText);
                lq.Weight.Source = q.Attributes["WeightSource"].InnerText;

                // filter scenarios
                foreach (XmlNode scenarios in q.SelectNodes("/Scenarios"))
                {
                    List <FilterInstruction> list = new List <FilterInstruction>();

                    foreach (XmlNode scenario in scenarios.SelectNodes("/Scenario/FilterInstruction"))
                    {
                        FilterInstruction fi = new FilterInstruction();
                        fi.VarName = scenario.Attributes["VarName"].InnerText;
                        switch (scenario.Attributes["Operation"].InnerText)
                        {
                        case "Equals":
                            fi.Oper = Operation.Equals;
                            break;

                        case "NotEquals":
                            fi.Oper = Operation.NotEquals;
                            break;

                        case "GreaterThan":
                            fi.Oper = Operation.GreaterThan;
                            break;

                        case "LessThan":
                            fi.Oper = Operation.LessThan;
                            break;
                        }

                        foreach (XmlNode resps in scenario.SelectNodes("/Responses/Response"))
                        {
                            fi.ValuesStr.Add(resps.Attributes["ResponseValue"].InnerText);
                        }
                        list.Add(fi);
                    }
                    lq.FilterList.Add(list);
                }

                Questions.Add(lq);
            }

            XmlNode user = runData.SelectSingleNode("/SurveyTiming/UserTypes/User");

            User             = new Respondent();
            User.Survey      = user.Attributes["Survey"].InnerText;
            User.Description = user.Attributes["Description"].InnerText;
            User.Weight      = Double.Parse(user.Attributes["Weight"].InnerText);

            foreach (XmlNode a in runData.SelectNodes("/SurveyTiming/UserTypes/User/Definition/DefinitionAnswer"))
            {
                Answer ans = new Answer(a.Attributes["VarName"].InnerText, a.Attributes["Response"].InnerText);
            }

            XmlNode maxuser = runData.SelectSingleNode("/SurveyTiming/Users/MaxUser");

            MaxUser             = new Respondent();
            MaxUser.Survey      = User.Survey;
            MaxUser.Description = User.Description;
            MaxUser.Weight      = User.Weight;

            foreach (XmlNode a in runData.SelectNodes("/SurveyTiming/UserTypes/MaxUser/Definition/DefinitionAnswer"))
            {
                Answer ans = new Answer(a.Attributes["VarName"].InnerText, a.Attributes["Response"].InnerText);
            }

            UserQuestionsMax = new List <LinkedQuestion>();

            foreach (XmlNode maxQ in runData.SelectNodes("/SurveyTiming/MaxQuestions/MaxQuestion"))
            {
                string varname = maxQ.Attributes["VarName"].InnerText;
                var    foundq  = QuestionAt(varname);
                if (foundq != null)
                {
                    UserQuestionsMax.Add(foundq);
                }
            }

            XmlNode minuser = runData.SelectSingleNode("/SurveyTiming/Users/MinUser");

            MaxUser             = new Respondent();
            MaxUser.Survey      = User.Survey;
            MaxUser.Description = User.Description;
            MaxUser.Weight      = User.Weight;

            foreach (XmlNode a in runData.SelectNodes("/SurveyTiming/UserTypes/MinUser/Definition/DefinitionAnswer"))
            {
                Answer ans = new Answer(a.Attributes["VarName"].InnerText, a.Attributes["Response"].InnerText);
            }

            UserQuestionsMin = new List <LinkedQuestion>();
            foreach (XmlNode minQ in runData.SelectNodes("/SurveyTiming/MinQuestions/MinQuestion"))
            {
                string varname = minQ.Attributes["VarName"].InnerText;
                var    foundq  = QuestionAt(varname);
                if (foundq != null)
                {
                    UserQuestionsMin.Add(foundq);
                }
            }
        }
Пример #15
0
        private string UsedAsFilterColumn(LinkedQuestion lq, List <LinkedQuestion> directFilterList, List <LinkedQuestion> indirectFilterList, FilterInstruction fi, bool includeIndirect = false)
        {
            string filterList = "";

            string direct   = "";
            string indirect = "";

            List <LinkedQuestion> directList = GetDirectFilterConditionList(fi);
            int directCount   = directList.Count();
            int indirectCount = 0;

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

                if (indirectList.Count() > 0)
                {
                    indirect = "<u><strong>Indirect:</strong></u>\r\n";

                    foreach (LinkedQuestion s in indirectList)
                    {
                        indirect += "<strong>" + s.VarName.RefVarName + "</strong> - " + s.VarName.VarLabel + "\r\n";
                    }
                }

                indirectCount = indirectList.Count();
            }

            if (directList.Count() > 0)
            {
                direct = "<u><strong>Direct:</strong></u>\r\n";

                foreach (LinkedQuestion s in directList)
                {
                    direct += "<strong>" + s.VarName.RefVarName + "</strong> - " + s.VarName.VarLabel + "\r\n";
                }
            }

            direct   = Utilities.TrimString(direct, "\r\n");
            indirect = Utilities.TrimString(indirect, "\r\n");
            if (!string.IsNullOrEmpty(indirect))
            {
                indirect += "\r\n\r\n";
            }

            filterList += "<strong>" + fi.ToString() + ":</strong> " + directCount + " (direct), " + indirectCount + " (indirect)" +
                          "\r\n" + direct + "\r\n\r\n" +
                          indirect;

            filterList = Utilities.TrimString(filterList, "\r\n");
            return(filterList);
        }