コード例 #1
0
        public IEnumerable <QuestionDto> GetQuestionsForTest(CreateTestQuery query, string userId)
        {
            // Get all public questions
            IEnumerable <Question> publicQuestions = _entities.Where(q => q.AccessModifier == (int)AccessModifier.Public);

            // Filter questions with at least one skill from the query skills
            List <Question> questions = publicQuestions.Where(q =>
                                                              (Utils.ConvertStringIdsToList(q.TestedSkills))
                                                              .Join(query.SkillIds, qSid => qSid, sId => sId, (qSid, sId) => sId)
                                                              .Count() > 0).ToList();

            List <QuestionDto> questionDtos = Mapper.Map <IEnumerable <Question>, IEnumerable <QuestionDto> >(questions).ToList();

            // Create the Mathcing Vector of the query
            int matchingVectorLength = (int)MatchingVectorIndex.StartOfSkills + new SkillsRepository(_context).Count();

            double[] queryMatchingVector = new double[matchingVectorLength];

            queryMatchingVector = BuildMatchingVector
                                  (
                queryMatchingVector,
                query.DifficultyLevel,
                query.SkillIds
                                  );

            double[] questionMatchingVector = new double[matchingVectorLength];
            for (int i = 0; i < questionDtos.Count; i++)
            {
                // Create the Mathcing Vector of the question
                Array.Clear(questionMatchingVector, 0, questionMatchingVector.Length);
                questionMatchingVector = BuildMatchingVector
                                         (
                    questionMatchingVector,
                    questions[i].Rank,
                    Utils.ConvertStringIdsToList(questions[i].TestedSkills)
                                         );

                // Calculate vectors distance
                double sum = 0;
                for (int j = 0; j < queryMatchingVector.Length; j++)
                {
                    sum += Math.Pow(questionMatchingVector[j] - queryMatchingVector[j], 2);
                }
                questionDtos[i].MatchingDistance = Math.Sqrt(sum);
            }

            // Return results ordered by distance
            return(questionDtos.OrderBy(q => q.MatchingDistance));
        }
コード例 #2
0
        public IEnumerable <QuestionDto> SearchQuestionsForTest([FromBody] CreateTestQuery query)
        {
            IEnumerable <QuestionDto> results = null;

            try
            {
                QuestionsRepository repository = new QuestionsRepository(_appDbContext);

                var questionDtos = repository.GetQuestionsForTest(query, _clientData.Id);

                results = repository.IncludeSkills(questionDtos);
            }
            catch (Exception e)
            {
                _log.LogError(e, "Error searching questions for test");
            }

            return(results);
        }