Esempio n. 1
0
 public DfcSearchService(ISearchService <JobProfileIndex> searchService, ISearchIndexConfig indexConfig, IJobProfileIndexEnhancer jobProfileIndexEnhancer, IAsyncHelper asyncHelper, IMapper mapper, IApplicationLogger applicationLogger)
 {
     this.applicationLogger       = applicationLogger;
     this.searchService           = searchService;
     this.index                   = indexConfig?.Name ?? string.Empty;
     this.jobProfileIndexEnhancer = jobProfileIndexEnhancer;
     this.asyncHelper             = asyncHelper;
     this.mapper                  = mapper;
 }
Esempio n. 2
0
        internal static IEnumerable <JobProfileIndex> ConvertToJobProfileIndex(this IEnumerable <IDocument> documents, IJobProfileIndexEnhancer jobProfileIndexEnhancer, IApplicationLogger applicationLogger)
        {
            var measure = Stopwatch.StartNew();
            Dictionary <string, JobProfileIndex> indexes = new Dictionary <string, JobProfileIndex>();

            var salaryPopulation = new List <Task <JobProfileSalary> >();
            var betaDocuments    = documents.Where(d => Convert.ToBoolean(d.GetValue(nameof(JobProfile.IsImported)) ?? false) == false);

            foreach (var item in betaDocuments)
            {
                //TODO: Check and confirm that the removed FilterableTitle and FilterableAlternativeTitle are no longer used.
                var jobProfileIndex = new JobProfileIndex
                {
                    IdentityField                  = item.IdentityField.Value?.ToString(),
                    UrlName                        = item.GetValue(nameof(JobProfileIndex.UrlName))?.ToString(),
                    Title                          = item.GetValue(nameof(JobProfileIndex.Title))?.ToString(),
                    AlternativeTitle               = item.GetValue(nameof(JobProfileIndex.AlternativeTitle))?.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()),
                    Overview                       = item.GetValue(nameof(JobProfileIndex.Overview))?.ToString(),
                    JobProfileCategories           = item.GetValue(nameof(JobProfileIndex.JobProfileCategories)) as IEnumerable <string>,
                    JobProfileSpecialism           = item.GetValue(nameof(JobProfileIndex.JobProfileSpecialism)) as IEnumerable <string>,
                    HiddenAlternativeTitle         = item.GetValue(nameof(JobProfileIndex.HiddenAlternativeTitle)) as IEnumerable <string>,
                    WYDDayToDayTasks               = item.GetValue(nameof(JobProfileIndex.WYDDayToDayTasks))?.ToString(),
                    CollegeRelevantSubjects        = item.GetValue(nameof(JobProfileIndex.CollegeRelevantSubjects))?.ToString(),
                    UniversityRelevantSubjects     = item.GetValue(nameof(JobProfileIndex.UniversityRelevantSubjects))?.ToString(),
                    ApprenticeshipRelevantSubjects = item.GetValue(nameof(JobProfileIndex.ApprenticeshipRelevantSubjects))?.ToString(),
                    CareerPathAndProgression       = item.GetValue(nameof(JobProfileIndex.CareerPathAndProgression))?.ToString(),
                    WorkingPattern                 = item.GetValue(nameof(JobProfileIndex.WorkingPattern)) as IEnumerable <string>,
                    WorkingHoursDetails            = item.GetValue(nameof(JobProfileIndex.WorkingHoursDetails)) as IEnumerable <string>,
                    WorkingPatternDetails          = item.GetValue(nameof(JobProfileIndex.WorkingPatternDetails)) as IEnumerable <string>,
                    MinimumHours                   = Convert.ToDouble(item.GetValue(nameof(JobProfileIndex.MinimumHours))),
                    MaximumHours                   = Convert.ToDouble(item.GetValue(nameof(JobProfileIndex.MaximumHours)))
                };

                var isSalaryOverriden = Convert.ToBoolean(item.GetValue(nameof(JobProfile.IsLMISalaryFeedOverriden)));
                jobProfileIndexEnhancer.Initialise(jobProfileIndex, documents.Count() == 1);
                jobProfileIndexEnhancer.PopulateRelatedFieldsWithUrl();
                if (isSalaryOverriden)
                {
                    jobProfileIndex.SalaryStarter     = Convert.ToDouble(item.GetValue(nameof(JobProfile.SalaryStarter)));
                    jobProfileIndex.SalaryExperienced = Convert.ToDouble(item.GetValue(nameof(JobProfile.SalaryExperienced)));
                }
                else
                {
                    if (!string.IsNullOrEmpty(jobProfileIndex.SocCode))
                    {
                        salaryPopulation.Add(jobProfileIndexEnhancer.PopulateSalary(jobProfileIndex.SocCode, jobProfileIndex.UrlName));
                    }
                }

                indexes.Add(jobProfileIndex.UrlName.ToLower(), jobProfileIndex);
            }

            var results = Task.Run(() => Task.WhenAll(salaryPopulation.ToArray())).GetAwaiter().GetResult();

            foreach (var idx in indexes)
            {
                var item = results.SingleOrDefault(r => r.JobProfileName.Equals(idx.Key, StringComparison.InvariantCultureIgnoreCase));
                if (item == null)
                {
                    applicationLogger.Warn($"WARN: Failed to get salary for '{idx.Key}'.");
                    continue;
                }

                idx.Value.SalaryStarter     = item.StarterSalary;
                idx.Value.SalaryExperienced = item.SalaryExperienced;
            }

            applicationLogger.Info($"Took {measure.Elapsed} to complete converting to JP index. And got {results.Count()} salary info and {results.Count(r => r.StarterSalary == 0)} results that have salary missing. But {indexes.Values.Count(i => i.SalaryStarter == 0)} indexes missing salary information! from a total of {indexes.Values.Count()}");
            return(indexes.Values);
        }