コード例 #1
0
        public async Task <IEnumerable <VacancyElasticModel> > Search(int skip, int amount,
                                                                      VacancySearchModel searchModel, VacancySortModel sortModel)
        {
            var result = await Task.Run(() => _vacancyElasticRepository.Search(skip, amount, searchModel, sortModel));

            return(result);
        }
コード例 #2
0
        public async Task <HttpContent> GetExcelByVacancies(int skip, int amount,
                                                            VacancySearchModel searchModel, VacancySortModel sortModel)
        {
            var stream = new MemoryStream(await AddToExcelVacancy(skip, amount, searchModel, sortModel));

            var result = CreateContent(stream, "Vacancies.xlsx");

            return(result);
        }
コード例 #3
0
        public async Task <byte[]> AddToExcelVacancy(int skip, int amount,
                                                     VacancySearchModel searchModel, VacancySortModel sortModel)
        {
            var vacancies = await vacancyService.Search(skip, amount, searchModel, sortModel);

            var excelVacancyList = vacancies.Select(ConvertToExcelModel).ToList();

            var result = ExcelCreator.GenerateExcel(excelVacancyList);

            return(result);
        }
コード例 #4
0
        public ActionResult Index(VacancySearchModel vacancySearchModel, string sortString)
        {
            if (!ModelState.IsValid)
            {
                return(View());
            }
            var dto = mapper.Map <SearchVacancyDTO>(vacancySearchModel);

            if (User.IsInRole(RoleNames.Jobseeker) || User.IsInRole(RoleNames.Hr))
            {
                dto.IsActive = true;
            }
            else
            {
                dto.IsActive = false;
            }
            if (User.IsInRole(RoleNames.Employee))
            {
                dto.EmployeeId = employeeAppService.GetByUser(User.Identity.Name).Id;
            }
            ICollection <VacancyDTO> vacancies;

            switch (sortString)
            {
            case SortStrings.DontSort:
                vacancies = vacancyAppService.Search(dto);
                break;

            case SortStrings.SortByVacancyName:
                vacancies = vacancyAppService.Search(dto).OrderBy(v => v.Name).ToList();
                break;

            case SortStrings.SortByProfessionlField:
                vacancies = vacancyAppService.Search(dto).OrderBy(v => v.ProfessionalField).ToList();
                break;

            case SortStrings.SortByDescription:
                vacancies = vacancyAppService.Search(dto).OrderBy(v => v.Description).ToList();
                break;

            case SortStrings.SortByReqirements:
                vacancies = vacancyAppService.Search(dto).OrderBy(v => v.Requierements).ToList();
                break;

            case SortStrings.SortBySalary:
                vacancies = vacancyAppService.Search(dto).OrderBy(v => v.SalaryFrom).ToList();
                break;

            default: vacancies = vacancyAppService.Search(dto);
                break;
            }
            return(PartialView(ViewStrings.SearchResultsView, mapper.Map <ICollection <VacancyModel> >(vacancies)));
        }
コード例 #5
0
        public async Task <ICollection <Vacancy> > Search(int skip, int amount, VacancySearchModel searchModel, VacancySortModel sortModel)
        {
            IQueryable <Vacancy> vacancies;

            vacancies = searchModel == null?vacancyRepository.ReadAll() : vacancyRepository.Find(searchModel);


            var res = Sorting(vacancies, sortModel).Skip(skip).Take(amount);

            var vacancyList = await Task.Run(() => res.ToList());

            return(vacancyList);
        }
コード例 #6
0
        public IQueryable <Vacancy> Find(VacancySearchModel searchModel)
        {
            IQueryable <Vacancy> query = dbSet.AsNoTracking();

            if (searchModel.Status != 0)
            {
                query = query.Where(vac => vac.Status == searchModel.Status);
            }

            if (searchModel.City != 0)
            {
                query = query.Where(vac => vac.City == searchModel.City);
            }

            if (searchModel.PrimarySkill != null)
            {
                if (searchModel.PrimarySkill.Id != 0)
                {
                    query = query.Where(vac => vac.VacancyPrimarySkill.TechSkill == searchModel.PrimarySkill.Id);
                }
                if (searchModel.PrimarySkill.Level != 0)
                {
                    query = query.Where(vac => vac.VacancyPrimarySkill.Level == searchModel.PrimarySkill.Level);
                }
            }

            if (searchModel.ProjectName != null)
            {
                query = query.Where(vac => vac.ProjectName == searchModel.ProjectName);
            }

            if (searchModel.RequestDate != DateTime.MinValue)
            {
                query = query.Where(vac => vac.RequestDate == searchModel.RequestDate);
            }

            if (searchModel.StartDate != DateTime.MinValue)
            {
                query = query.Where(vac => vac.StartDate == searchModel.StartDate);
            }

            if (searchModel.VacancyName != null)
            {
                query = query.Where(vac => vac.VacancyName == searchModel.VacancyName);
            }
            return(query);
        }
コード例 #7
0
ファイル: VacancyFilter.cs プロジェクト: Pointy-hair/KnowBase
        public static bool Filter(VacancySearchModel vsm, Vacancy v)
        {
            if (vsm == null)
            {
                return(true);
            }

            if (vsm.City != 0)
            {
                if (v.City != null)
                {
                    if (v.City.Value != vsm.City)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            if (vsm.Status != 0)
            {
                if (v.Status != vsm.Status)
                {
                    return(false);
                }
            }

            if (vsm.PrimarySkill != null)
            {
                if (v.VacancyPrimarySkill != null)
                {
                    if (vsm.PrimarySkill.Id != 0)
                    {
                        if (v.VacancyPrimarySkill.TechSkill != vsm.PrimarySkill.Id)
                        {
                            return(false);
                        }
                    }

                    if (vsm.PrimarySkill.Level != 0)
                    {
                        if (v.VacancyPrimarySkill.Level != vsm.PrimarySkill.Level)
                        {
                            return(false);
                        }
                    }
                }
                else
                {
                    return(false);
                }
            }

            if (vsm.StartDate != null)
            {
                if (v.StartDate != null)
                {
                    if (DateTime.Compare(v.StartDate.Value, vsm.StartDate) < 0)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            if (vsm.RequestDate != null)
            {
                if (v.RequestDate != null)
                {
                    if (DateTime.Compare(v.RequestDate.Value, vsm.RequestDate) < 0)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            if (vsm.ProjectName != null)
            {
                if (v.ProjectName != null)
                {
                    var vacWords = v.ProjectName.Split(' ');

                    var searchWords = vsm.ProjectName.Split(' ');

                    if (LevenshteinDistanceCalculator.GetDistance(vsm.ProjectName, v.ProjectName) > LevenshteinDistanceCalculator.MaxAllowedDistance)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            if (vsm.VacancyName != null)
            {
                if (v.VacancyName != null)
                {
                    if (LevenshteinDistanceCalculator.GetDistance(v.VacancyName, vsm.VacancyName) > LevenshteinDistanceCalculator.MaxAllowedDistance)
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #8
0
        public IEnumerable <VacancyElasticModel> Search(int skip, int amount,
                                                        VacancySearchModel searchModel, VacancySortModel sortModel)
        {
            var sort = Sort(sortModel);

            searchModel = searchModel ?? new VacancySearchModel();
            return(_client.Search <VacancyElasticModel>(s =>
                                                        s.Index(IndexName)
                                                        .Skip(skip)
                                                        .Take(amount)
                                                        .Query(q =>
            {
                QueryContainer queryContainer = null;

                if (searchModel.City != 0)
                {
                    queryContainer &= q.Nested(ns => ns
                                               .Path(p => p.City)
                                               .Query(qr => qr
                                                      .Term(x => x.City.Id, searchModel.City)
                                                      ));
                }
                if (searchModel.Status != 0)
                {
                    queryContainer &= q.Nested(ns => ns
                                               .Path(p => p.Status)
                                               .Query(qr => qr
                                                      .Term(x => x.Status.Id, searchModel.Status)
                                                      ));
                }

                if (searchModel.PrimarySkill != null)
                {
                    if (searchModel.PrimarySkill.Id != 0)
                    {
                        queryContainer &= q.Nested(ns => ns
                                                   .Path(p => p.PrimarySkill)
                                                   .Query(qr => qr
                                                          .Term(v => v.PrimarySkill.TechSkill, searchModel.PrimarySkill.Id)
                                                          ));
                    }
                    if (searchModel.PrimarySkill.Level != 0)
                    {
                        queryContainer &= q.Nested(ns => ns
                                                   .Path(p => p.PrimarySkill)
                                                   .Query(qr => qr
                                                          .Term(v => v.PrimarySkill.Level, searchModel.PrimarySkill.Level)));
                    }
                }
                if (searchModel.RequestDate != DateTime.MinValue)
                {
                    queryContainer &= q.Term(v => v.RequestDate, searchModel.RequestDate);
                }
                if (searchModel.StartDate != DateTime.MinValue)
                {
                    queryContainer &= q.Term(v => v.StartDate, searchModel.StartDate);
                }
                //queryContainer &= q.MatchPhrase(fr => fr
                //    .Field(z => z.ProjectName)
                //    .Query(searchModel.ProjectName)
                //    .Fuzziness(Fuzziness.Auto)
                //    .FuzzyTranspositions()
                //    .MaxExpansions(2)
                //    .MinimumShouldMatch(2)
                //    .PrefixLength(2)
                //    .Operator(Operator.Or)
                //    .Slop(2)
                //    .Boost(2));
                if (searchModel.ProjectName != null)
                {
                    var projectNames = searchModel.ProjectName.Split(' ');
                    foreach (var projectName in projectNames)
                    {
                        queryContainer &= q.MatchPhrase(mp =>
                                                        mp.Field(f => f.ProjectName).Query(projectName)
                                                        .Fuzziness(Fuzziness.EditDistance(2)));
                    }
                }
                if (searchModel.VacancyName != null)
                {
                    var vacancyNames = searchModel.VacancyName.Split(' ');
                    foreach (var vacancyName in vacancyNames)
                    {
                        queryContainer &= q.MatchPhrase(mp =>
                                                        mp.Field(f => f.VacancyName).Query(vacancyName)
                                                        .Fuzziness(Fuzziness.EditDistance(2)));
                    }
                }
                //queryContainer &= q.Fuzzy(x => x
                //    .Field(z => z.ProjectName)
                //    .Value(searchModel.ProjectName)
                //    .Fuzziness(Fuzziness.Auto)
                //);
                //queryContainer &= q.Fuzzy(x => x
                //        .Field(z => z.VacancyName)
                //        .Value(searchModel.VacancyName)
                //        .Fuzziness(Fuzziness.Auto)
                //    );
                return queryContainer;
            }
                                                               )
                                                        .Sort(p => p = sort)
                                                        ).Documents);
        }
コード例 #9
0
        public async Task SearchTest()
        {
            Vacancy vacancy1 = new Vacancy()
            {
                Id = 22,

                Status = 1,

                ProjectName = "Some project name",

                City = 4
            };

            Vacancy vacancy2 = new Vacancy()
            {
                Id = 2,

                Status = 4,

                ProjectName = "Another project name",

                City = 2
            };

            VacancySearchModel searchModel = new VacancySearchModel()
            {
                VacancyName = "JavaScript Junior Developer",

                City = 3,

                Status = 2,

                RequestDate = new DateTime(2017, 8, 8)
            };

            IQueryable <Vacancy> vacancyFindList = new List <Vacancy>().AsQueryable();

            IQueryable <Vacancy> vacancyReadList = new List <Vacancy>()
            {
                vacancy1, vacancy2
            }.AsQueryable();

            mockVacancyRepository.Setup(x => x.Find(It.IsAny <VacancySearchModel>())).Returns(vacancyFindList);

            mockVacancyRepository.Setup(x => x.ReadAll()).Returns(vacancyReadList);

            var candidateRepository = mockCandidateRepository.Object;

            var unitOfWork = mockUnitOfWork.Object;

            var candidateService = mockCandidateService.Object;

            var techSkillRepository = mockTechSkillRepository.Object;

            var vacancyRepository = mockVacancyRepository.Object;

            var eventService = mockEventService.Object;

            var vacancyService = new VacancyService(unitOfWork, vacancyRepository, candidateRepository, techSkillRepository,
                                                    candidateService, eventService);

            var result = await vacancyService.Search(0, 5, searchModel, null);

            Assert.AreEqual(0, result.Count);

            var actual = await vacancyService.Search(0, 5, null, null);

            Assert.AreEqual(2, actual.Count);
        }