コード例 #1
0
 /// <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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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);
        }