public InstructionSet(TemperatureInstruction temp, TimeInstruction t, TeaInstruction tea, FilterInstruction filter) { this.time = t; this.tea = tea; this.filter = filter; this.temperature = temp; }
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); } }
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)); }
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)); }
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); }
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)); }
// // 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); }
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)); }
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); }
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); }
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); } }
private void CreateNewMatchCondition() { _currentFilterInstruction = new FilterInstruction(); //_scenarios.Add(_currentFilterInstruction); }
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); } } }
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); }