/// <summary> /// Try resolving the item score. If it successfully resolves return true, if it throws an error return false. The original object is unedited. /// </summary> /// <param name="scoreInfo"></param> /// <returns></returns> public bool CheckValidResolvedItemScore(ItemScoreInfo scoreInfo) { try { ItemScoreInfo _obj = new ItemScoreInfo(scoreInfo); ResolveItemScore(_obj); } catch { return(false); } return(true); }
protected virtual string GetDimensionsXmlForSP(ItemScoreInfo scoreInfo) { scoreInfo.Rationale = null; if (scoreInfo.SubScores != null) { foreach (ItemScoreInfo subScore in scoreInfo.SubScores) { subScore.Rationale = null; } } return(HttpWebHelper.SerializeXml(scoreInfo)); }
/// <summary> /// Serialize the ScoreInfo property into an ItemScoreInfo object. This does not handle errors. Returns null if ScoreInfo is null or empty /// </summary> /// <returns></returns> public ItemScoreInfo GetItemScoreInfo() { if (string.IsNullOrEmpty(ScoreInfo)) { ItemScoreInfo si = new ItemScoreInfo(); if (!String.IsNullOrEmpty(this.ScoreRationale)) { si.Rationale = new ScoreRationale(); si.Rationale.Msg = this.ScoreRationale; } return(si); } return((ItemScoreInfo)Utilities.Serialization.DeserializeXml <ItemScoreInfo>(ScoreInfo)); }
internal List <ItemResponse> MergeScores(List <TestOpportunityItemScore> mergeFrom, List <ItemResponse> mergeTo, Func <TestOpportunityItemScore, ItemResponse, bool> shouldMerge) { List <ItemResponse> merged = new List <ItemResponse>(); foreach (TestOpportunityItemScore score in mergeFrom) { ItemResponse ir = mergeTo.FirstOrDefault(x => x.ItemKey == score.ItemKey && x.BankKey == score.BankKey); if (ir == null) { throw new NullReferenceException(string.Format("Item not found in opportunity when merging scores from outside vendor. ItemKey={0}, BankKey={1}, oppID={2}", score.ItemKey, score.BankKey, score.OppID)); } if (!shouldMerge(score, ir)) { continue; } ItemScoreInfo scoreInfo = null; try { scoreInfo = score.GetItemScoreInfo(); } catch (Exception e) { throw new FormatException(string.Format("Failed serializing ItemScoreInfo. ItemKey={0}, BankKey={1}, oppID={2}, ScoreInfo text='{3}'. Error: {4}", score.ItemKey, score.BankKey, score.OppID, score.ScoreInfo ?? "null", e.Message)); } //finally merge the score info ir.ScoreInfo = scoreInfo; ir.ScoreRationale = score.ScoreInfo; ir.ScoreStatus = score.ScoreStatus.ToUpper(); // item scorestatus is all caps. // todo: validation? ir.presentedScore = score.Score == null ? -1 : (double)score.Score.Value; merged.Add(ir); } return(merged); }
public abstract ItemScoreInfo ResolveItemScore(ItemScoreInfo scoreInfo);
/// <summary> /// Evidence, purpose, and conventions are the scoring dimensions for the writing essays. Scores for evidence and purpose dimensions will be averaged, and the average will be rounded up. /// The conventions dimension gets renamed "C", and the new merged dimension is named "D" /// </summary> /// <param name="scoreInfo"></param> /// <returns></returns> public override ItemScoreInfo ResolveItemScore(ItemScoreInfo scoreInfo) { if (scoreInfo == null) { return(null); } //only do the merging when given an overall dimension if (!scoreInfo.Dimension.Equals("Overall", StringComparison.InvariantCultureIgnoreCase)) { throw new NullReferenceException("ScoreInfo does not contain the Overall dimension. This is required for WER items in SBACItemResolutionRuleWER"); } //check we have subscores if (scoreInfo.SubScores == null) { throw new NullReferenceException("ScoreInfo does not contain any subscores. Conventions, Evidence/Elaboration, and Organization/Purpose are required subscore dimensions for WER items in SBACItemResolutionRuleWER"); } //grab conventions, evidence, and purpose dimensions for processing ItemScoreInfo conventions = scoreInfo.SubScores.FirstOrDefault(x => x.Dimension.Equals("Conventions")); if (conventions == null) { throw new NullReferenceException("Conventions dimension was not present. This is required for WER items in SBACItemResolutionRuleWER"); } ItemScoreInfo evidence = scoreInfo.SubScores.FirstOrDefault(x => x.Dimension.Equals("Evidence/Elaboration")); if (evidence == null) { throw new NullReferenceException("Evidence/Elaboration dimension was not present. This is required for WER items in SBACItemResolutionRuleWER"); } ItemScoreInfo purpose = scoreInfo.SubScores.FirstOrDefault(x => x.Dimension.Equals("Organization/Purpose")); if (purpose == null) { throw new NullReferenceException("Organization/Purpose dimension was not present. This is required for WER items in SBACItemResolutionRuleWER"); } //averaging of purpose/evidence. We round up and convert to int. double avg = (double)(Convert.ToInt16(evidence.pointsAsText) + Convert.ToInt16(purpose.pointsAsText)) / 2.0; int avgInt = (int)Math.Round(avg, MidpointRounding.AwayFromZero); int maxScore = (int)Math.Round(((Convert.ToInt16(evidence.maxScoreAsText) + Convert.ToInt16(purpose.maxScoreAsText)) / 2.0), MidpointRounding.AwayFromZero); //add new ScoreInfo node to hold the averaged dimension with dimension name "D". //We add a ScoreInfo node to the SubScoreList of this new "D" dimension node with dimension = "Final" //TODO: what if one or both dimensions collapsed have condition codes? For now just hardcoded to empty string ItemScoreInfo avgDim = new ItemScoreInfo(avgInt, maxScore, ScoringStatus.Scored, "D", GetRationale(null)); ItemScoreInfo avgDimSubScore = new ItemScoreInfo(avgInt, maxScore, ScoringStatus.Scored, "Final", null /*new ScoreRationale() { Msg = "{\"scorerID\":\"SBACItemResolutionRuleWER\"}" }*/); avgDim.SubScores = new List <ItemScoreInfo>(); avgDim.SubScores.Add(avgDimSubScore); scoreInfo.SubScores.Add(avgDim); // add new ScoreInfo node which copies the conventions dimension but changes name to "C" ItemScoreInfo newConventionDim = new ItemScoreInfo(conventions); newConventionDim.Dimension = "C"; newConventionDim.Rationale = GetRationale(newConventionDim.Rationale); if (newConventionDim.SubScores == null) { newConventionDim.SubScores = new List <ItemScoreInfo>(); } ItemScoreInfo newConvDimInitialSubScore = newConventionDim.SubScores.FirstOrDefault(x => x.Dimension.Equals("Initial")); if (newConventionDim.SubScores.Count != 1 || newConvDimInitialSubScore == null) { throw new NullReferenceException(string.Format("The Conventions dimension must contain only the Initial read. This dimension contains {0} reads, and no Initial read. These requirements are for WER items in resolution rule SBACItemResolutionRuleWER", newConventionDim.SubScores.Count)); } newConvDimInitialSubScore.Dimension = "Final"; newConvDimInitialSubScore.Rationale = GetRationale(newConvDimInitialSubScore.Rationale); scoreInfo.SubScores.Add(newConventionDim); // finally update the overall item score and score status. Should have come from the scorer as -1, NotScored. scoreInfo.Points = avgDim.Points + newConventionDim.Points; scoreInfo.Status = ScoringStatus.Scored; return(scoreInfo); }