internal AdSearchResultModel AdvancedSearchAds(AdvancedAdSearchModel searchQuery) { // This search relies on a selected category Category selectedCategory = _repository.Get <Category>(searchQuery.CategorySelectedId); // create search parameters object from AdvancedAdSearchModel AdSearchParameters searchParameters = CreateSearchParameters(searchQuery); // call repo with Type T based on switch on category with parameters (same for all objects) IList <SearchAdCache> searchResult = new List <SearchAdCache>(); switch (selectedCategory.Type) { case AdTypeEnum.CarAd: searchResult = _searchRepository.AdvancedSearchAds <CarAd>(searchParameters); break; case AdTypeEnum.OtherVehiculeAd: searchResult = _searchRepository.AdvancedSearchAds <OtherVehicleAd>(searchParameters); break; case AdTypeEnum.MotoAd: searchResult = _searchRepository.AdvancedSearchAds <MotoAd>(searchParameters); break; case AdTypeEnum.RealEstateAd: searchResult = _searchRepository.AdvancedSearchAds <RealEstateAd>(searchParameters); break; case AdTypeEnum.MotorBoatAd: searchResult = _searchRepository.AdvancedSearchAds <MotorBoatAd>(searchParameters); break; case AdTypeEnum.SailingBoatAd: searchResult = _searchRepository.AdvancedSearchAds <SailingBoatAd>(searchParameters); break; case AdTypeEnum.MotorBoatEngineAd: searchResult = _searchRepository.AdvancedSearchAds <MotorBoatEngineAd>(searchParameters); break; case AdTypeEnum.WaterSportAd: searchResult = _searchRepository.AdvancedSearchAds <WaterSportAd>(searchParameters); break; case AdTypeEnum.Ad: searchResult = _searchRepository.AdvancedSearchAds <Ad>(searchParameters); break; } // Create models for search results AdSearchResultModel model = new AdSearchResultModel(searchQuery); model.SearchResultTotalCount = searchResult.Count; model.SearchResult = searchResult.Select(a => new AdSearchResultItemModel(a)).ToList(); return(model); }
public IList <SearchAdCache> AdvancedSearchAds <T>(AdSearchParameters parameters) where T : BaseAd { ICriteria query = createRootCriteria(parameters.AndSearchStrings, parameters.CityId, parameters.CategoryIds); DetachedCriteria crit = creatDetachedCriteria <T>(parameters); query.Add(Subqueries.PropertyIn("AdId", crit)); return(query.List <SearchAdCache>()); }
private AdSearchParameters CreateSearchParameters(AdvancedAdSearchModel searchQuery) { AdSearchParameters parameters = new AdSearchParameters(); if (!String.IsNullOrEmpty(searchQuery.SearchString)) { parameters.AndSearchStrings = searchQuery.SearchString.Trim().Split(' '); } parameters.CategoryIds = GetCategoryIdsFromQuery(searchQuery.CategorySelectedId); parameters.CityId = searchQuery.CitySelectedId; parameters.MinPrice = searchQuery.MinPrice; parameters.MaxPrice = searchQuery.MaxPrice; // -- Vehicles specific properties -- // if (searchQuery.AgeBracketSelectedId.HasValue) { parameters.MaxYear = _referenceServices.GetAllAgeBrackets()[searchQuery.AgeBracketSelectedId.Value].LowValue; parameters.MaxYear = _helperService.GetCurrentDateTime().Year - parameters.MaxYear; parameters.MinYear = _referenceServices.GetAllAgeBrackets()[searchQuery.AgeBracketSelectedId.Value].HighValue; parameters.MinYear = _helperService.GetCurrentDateTime().Year - parameters.MinYear; } if (searchQuery.KmBracketSelectedId.HasValue) { parameters.MinKm = _referenceServices.GetAllKmBrackets()[searchQuery.KmBracketSelectedId.Value].LowValue; parameters.MaxKm = _referenceServices.GetAllKmBrackets()[searchQuery.KmBracketSelectedId.Value].HighValue; } if (searchQuery.EngineSizeBracketSelectedId.HasValue) { parameters.MinEngineSize = _referenceServices.GetAllEngineSizeBrackets()[searchQuery.EngineSizeBracketSelectedId.Value].LowValue; parameters.MaxEngineSize = _referenceServices.GetAllEngineSizeBrackets()[searchQuery.EngineSizeBracketSelectedId.Value].HighValue; } parameters.BrandId = searchQuery.BrandSelectedId; parameters.FueldId = searchQuery.FuelSelectedId; parameters.IsAuto = searchQuery.IsAutomatic; //-- Real Estate specific properties --// parameters.RealEstateTypeId = searchQuery.SelectedRealEstateTypeId; parameters.DistrictId = searchQuery.SelectedDistrictId; parameters.IsFurnished = searchQuery.IsFurnished; if (searchQuery.NbRoomsBracketSelectedId.HasValue) { parameters.MinNbRooms = _referenceServices.GetAllRealEstateNbRoomsBrackets()[searchQuery.NbRoomsBracketSelectedId.Value].LowValue; parameters.MaxNbRooms = _referenceServices.GetAllRealEstateNbRoomsBrackets()[searchQuery.NbRoomsBracketSelectedId.Value].HighValue; } if (searchQuery.SurfaceAreaBracketSelectedId.HasValue) { parameters.MinSurfaceArea = _referenceServices.GetAllSurfaceAreaBrackets()[searchQuery.SurfaceAreaBracketSelectedId.Value].LowValue; parameters.MaxSurfaceArea = _referenceServices.GetAllSurfaceAreaBrackets()[searchQuery.SurfaceAreaBracketSelectedId.Value].HighValue; } //-- Water sport specific properties --// parameters.MotorBoatTypeId = searchQuery.SelectedMotorBoatTypeId; parameters.MotorEngineTypeId = searchQuery.SelectedMotorTypeId; parameters.SailingBoatTypeId = searchQuery.SelectedSailingBoatTypeId; parameters.HullTypeId = searchQuery.SelectedHullTypeId; parameters.WaterTypeId = searchQuery.SelectedWaterTypeId; parameters.MinLength = searchQuery.MinLength; parameters.MaxLength = searchQuery.MaxLength; parameters.MinHp = searchQuery.MinHp; parameters.MaxHp = searchQuery.MaxHp; return(parameters); }
public void AdvancedSearchAds_MotorBoatAd_MotorBoatProperties_ReturnMotorBoatAd() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Bateau à moteur", LabelUrlPart = "Bateau" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "bateau", Body = "la desc du bateau", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; MotorBoatType mbt = new MotorBoatType() { Id = 5, Label = "Bois" }; MotorBoatEngineType mt = new MotorBoatEngineType() { Id = 7, Label = "4 temps" }; MotorBoatAd bat = new MotorBoatAd { Id = 1, Title = "bateau", Body = "la desc du bateau", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Price = 1000, Hp = 100, Length = 6, MotorBoatType = mbt, MotorType = mt, Year = 2005 }; repo.Save(mbt); repo.Save(mt); repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(bat); repo.Save(a); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { MotorBoatTypeId = 1, MotorEngineTypeId = 1, MinHp = 99, MaxHp = 100, MinLength = 6, MaxLength = 10, MinYear = 2004, MaxYear = 2006 }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <MotorBoatAd>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a, result[0]); } }
public void AdvancedSearchAds_Ad_MinMaxPrice_ReturnMatchingAds() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Location", LabelUrlPart = "Location" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "chaussure", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; Ad loc = new Ad { Id = 1, Title = "chaussure", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Price = 1000 }; repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(loc); repo.Save(a); SearchAdCache a2 = new SearchAdCache { AdId = 2, Title = "chaussure", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; Ad loc2 = new Ad { Id = 2, Title = "chaussure", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Price = 2000 }; repo.Save(loc2); repo.Save(a2); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { MinPrice = 0, MaxPrice = 1000 }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <Ad>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a, result[0]); } }
public void AdvancedSearchAds_RealEstateAds_RealEstateProperties_ReturnRealEstateAd() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Location", LabelUrlPart = "Location" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "appart", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; RealEstateType t1 = new RealEstateType { Label = "Location" }; District d = new District { City = c, Label = "Cheznous" }; RealEstateAd loc = new RealEstateAd { Id = 1, Title = "appart", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Type = t1, District = d, RoomsNumber = 5, IsFurnished = true, SurfaceArea = 45 }; repo.Save(t1); repo.Save(d); repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(loc); repo.Save(a); MotoBrand brand = new MotoBrand { Label = "Suzuki" }; SearchAdCache a2 = new SearchAdCache { AdId = 2, Title = "appart2", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; RealEstateAd loc2 = new RealEstateAd { Id = 2, Title = "appart2", Body = "boite a chaussure", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Type = t1, District = d, RoomsNumber = 4, IsFurnished = true, SurfaceArea = 65 }; repo.Save(loc2); repo.Save(a2); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { AndSearchStrings = new String[] { "appart" }, MinNbRooms = 2, MaxNbRooms = 4, DistrictId = 1, RealEstateTypeId = 1, IsFurnished = true, MinSurfaceArea = 60, MaxSurfaceArea = 65 }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <RealEstateAd>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a2, result[0]); } }
public void AdvancedSearchAds_MotoAds_MotoProperties_ReturnMotoAd() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Auto", LabelUrlPart = "Auto" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; CarAd car = new CarAd { Id = 1, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u }; repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(car); repo.Save(a); Category cat2 = new Category { Label = "Moto", LabelUrlPart = "Moto" }; MotoBrand brand = new MotoBrand { Label = "Suzuki" }; SearchAdCache a2 = new SearchAdCache { AdId = 2, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat2 }; MotoAd moto = new MotoAd { Id = 2, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat2, Brand = brand, EngineSize = 650, CreatedBy = u }; repo.Save(brand); repo.Save(cat2); repo.Save(moto); repo.Save(a2); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { AndSearchStrings = new String[] { "aveo" }, BrandId = brand.Id, MinEngineSize = 250, MaxEngineSize = 800 }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <MotoAd>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a2, result[0]); } }
public void AdvancedSearchAds_CarAds_CarProperties_ReturnCarAd() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Auto", LabelUrlPart = "Auto" }; CarFuel fuel = new CarFuel { Label = "Diesel" }; VehicleBrand brand = new VehicleBrand { Label = "Aveo" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; CarAd car = new CarAd { Id = 1, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, Year = 2011, Kilometers = 10000, IsAutomatic = true, Fuel = fuel, Brand = brand, CreatedBy = u }; repo.Save(brand); repo.Save(fuel); repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(car); repo.Save(a); SearchAdCache a2 = new SearchAdCache { Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; CarAd car2 = new CarAd { Id = 1, Title = "aveo", Body = "aveo sport 1.2 16s", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, Year = 2001, Kilometers = 95000, Brand = brand, CreatedBy = u }; repo.Save(car2); repo.Save(a2); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { AndSearchStrings = new String[] { "aveo" }, MinKm = 0, MaxKm = 11000, MinYear = 2000, MaxYear = 2012, BrandId = brand.Id, FueldId = fuel.Id, IsAuto = true }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <CarAd>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a, result[0]); } }
public void AdvancedSearchAds_WaterSportAd_WaterSportProperties_ReturnWaterSportAd() { ISessionFactory sessionFactory = NhibernateHelper.SessionFactory; Repository repo = new Repository(sessionFactory); SearchRepository adRepo = new SearchRepository(sessionFactory); using (ITransaction transaction = sessionFactory.GetCurrentSession().BeginTransaction()) { // Given #region test data Province p1 = new Province { Label = "p1" }; User u = new User { Email = "*****@*****.**", Password = "******" }; repo.Save <User>(u); City c = new City { Label = "city", LabelUrlPart = "city" }; p1.AddCity(c); Category cat = new Category { Label = "Bateau à moteur", LabelUrlPart = "Bateau" }; SearchAdCache a = new SearchAdCache { AdId = 1, Title = "bateau", Body = "la desc du bateau", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat }; WaterSportType st = new WaterSportType() { Label = "pmt" }; WaterSportAd bat = new WaterSportAd { Id = 1, Title = "bateau", Body = "la desc du bateau", City = c, CreationDate = new DateTime(2012, 01, 16, 23, 52, 18), Category = cat, CreatedBy = u, Type = st }; repo.Save(st); repo.Save(p1); repo.Save(c); repo.Save(cat); repo.Save(u); repo.Save(bat); repo.Save(a); repo.Flush(); #endregion AdSearchParameters param = new AdSearchParameters { WaterTypeId = 1 }; // When IList <SearchAdCache> result = adRepo.AdvancedSearchAds <WaterSportAd>(param); // Then Assert.AreEqual(1, result.Count); Assert.AreEqual(a, result[0]); } }
private DetachedCriteria creatDetachedCriteria <T>(AdSearchParameters parameters) where T : BaseAd { DetachedCriteria crit = DetachedCriteria.For <T>(); if (parameters.MinPrice.HasValue) { crit.Add(Restrictions.Ge("Price", parameters.MinPrice.Value)); } if (parameters.MaxPrice.HasValue) { crit.Add(Restrictions.Le("Price", parameters.MaxPrice.Value)); } if (parameters.MinKm.HasValue) { crit.Add(Restrictions.Ge("Kilometers", parameters.MinKm.Value)); } if (parameters.MaxKm.HasValue) { crit.Add(Restrictions.Le("Kilometers", parameters.MaxKm.Value)); } if (parameters.MinYear.HasValue) { crit.Add(Restrictions.Ge("Year", parameters.MinYear.Value)); } if (parameters.MaxYear.HasValue) { crit.Add(Restrictions.Le("Year", parameters.MaxYear.Value)); } if (parameters.BrandId.HasValue) { crit.Add(Restrictions.Eq("Brand.Id", parameters.BrandId)); } if (parameters.FueldId.HasValue) { crit.Add(Restrictions.Eq("Fuel.Id", parameters.FueldId)); } if (parameters.IsAuto.HasValue) { crit.Add(Restrictions.Eq("IsAutomatic", parameters.IsAuto)); } if (parameters.MinEngineSize.HasValue) { crit.Add(Restrictions.Ge("EngineSize", parameters.MinEngineSize)); } if (parameters.MaxEngineSize.HasValue) { crit.Add(Restrictions.Le("EngineSize", parameters.MaxEngineSize)); } if (parameters.MinNbRooms.HasValue) { crit.Add(Restrictions.Ge("RoomsNumber", parameters.MinNbRooms)); } if (parameters.MaxNbRooms.HasValue) { crit.Add(Restrictions.Le("RoomsNumber", parameters.MaxNbRooms)); } if (parameters.DistrictId.HasValue) { crit.Add(Restrictions.Eq("District.Id", parameters.DistrictId)); } if (parameters.RealEstateTypeId.HasValue) { crit.Add(Restrictions.Eq("Type.Id", parameters.RealEstateTypeId)); } if (parameters.IsFurnished.HasValue) { crit.Add(Restrictions.Eq("IsFurnished", parameters.IsFurnished)); } if (parameters.MinSurfaceArea.HasValue) { crit.Add(Restrictions.Ge("SurfaceArea", parameters.MinSurfaceArea)); } if (parameters.MaxSurfaceArea.HasValue) { crit.Add(Restrictions.Le("SurfaceArea", parameters.MaxSurfaceArea)); } if (parameters.MotorBoatTypeId.HasValue) { crit.Add(Restrictions.Eq("MotorBoatType.Id", parameters.MotorBoatTypeId)); } if (parameters.MotorEngineTypeId.HasValue) { crit.Add(Restrictions.Eq("MotorType.Id", parameters.MotorEngineTypeId)); } if (parameters.MinLength.HasValue) { crit.Add(Restrictions.Ge("Length", parameters.MinLength)); } if (parameters.MaxLength.HasValue) { crit.Add(Restrictions.Le("Length", parameters.MaxLength)); } if (parameters.MinHp.HasValue) { crit.Add(Restrictions.Ge("Hp", parameters.MinHp)); } if (parameters.MaxHp.HasValue) { crit.Add(Restrictions.Le("Hp", parameters.MaxHp)); } if (parameters.SailingBoatTypeId.HasValue) { crit.Add(Restrictions.Eq("SailingBoatType.Id", parameters.SailingBoatTypeId)); } if (parameters.HullTypeId.HasValue) { crit.Add(Restrictions.Eq("HullType.Id", parameters.HullTypeId)); } if (parameters.WaterTypeId.HasValue) { crit.Add(Restrictions.Eq("Type.Id", parameters.WaterTypeId)); } crit.SetProjection(Projections.Property("Id")); return(crit); }