private ProductGroupMappingDto BuildUp(ProductGroupMappingDto dto, ProductGroupMapping mapping, Action <ProductGroupMappingDto> onLevel = null) { ProductGroupMappingDto parentDto = new ProductGroupMappingDto(); parentDto.Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name; parentDto.ProductGroupMappingID = mapping.ProductGroupMappingID; parentDto.HasChildren = true; parentDto.Children = new List <ProductGroupMappingDto>(); parentDto.Lineage = mapping.Lineage; parentDto.Depth = mapping.Depth; //attach the child parentDto.Children.Add(dto); if (onLevel != null) { onLevel(parentDto); } if (mapping.ParentMapping != null) //has more parents { return(BuildUp(parentDto, mapping.ParentMapping, onLevel)); } return(parentDto); }
private void AttachChildByLineage(ProductGroupMappingDto dtoToAttach, int parentMappingID, List <ProductGroupMappingDto> collection, List <int> lineage, int currentLevel) { var parent = collection.Where(c => c.ProductGroupMappingID == parentMappingID).FirstOrDefault(); if (parent == null) { AttachChildByLineage(dtoToAttach, parentMappingID, collection.FirstOrDefault(c => c.ProductGroupMappingID == currentLevel).Children, lineage, lineage[lineage.IndexOf(currentLevel) + 1]); } else { if (parent.Children == null) { parent.Children = new List <ProductGroupMappingDto>(); } parent.Children.Add(dtoToAttach); } }
private ProductGroupMappingDto GetProductGroupMappingLevelDto(ProductGroupMappingDto dto, ProductGroupMapping mapping, List <ProductGroupMapping> mappings, IRepository <ProductGroupMapping> repo) { dto.Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name; dto.ProductGroupMappingID = mapping.ProductGroupMappingID; dto.HasChildren = repo.GetAllAsQueryable(c => c.ParentProductGroupMappingID == dto.ProductGroupMappingID).Count() > 0; dto.Lineage = mapping.Lineage; dto.Depth = mapping.Depth; var children = mappings.Where(c => c.ParentProductGroupMappingID.HasValue && c.ParentProductGroupMappingID == dto.ProductGroupMappingID).ToList(); if (children.Count > 0) { dto.Children = new List <ProductGroupMappingDto>(); children.ForEach((map, id) => { dto.Children.Add(GetProductGroupMappingLevelDto(new ProductGroupMappingDto(), map, mappings, repo)); }); } return(dto); }
public List <ProductGroupMappingDto> GetByLineage(string lineage, int?connectorID = null, bool wholeTree = true) { if (!connectorID.HasValue) { connectorID = Client.User.ConnectorID; } var objects = Repository().GetAll(c => (!connectorID.HasValue || (connectorID.HasValue && connectorID.Value == c.ConnectorID))); if (!wholeTree) { var depth = lineage.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Count(); var mapps = objects.Where(c => c.Lineage.StartsWith(lineage) && c.Depth == depth).ToList(); List <ProductGroupMappingDto> dtos = new List <ProductGroupMappingDto>(); mapps.ForEach((mapping, ix) => { //testing var checkExcists2 = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID); string menuName2; if (checkExcists2 != null) { menuName2 = checkExcists2.Name; } else { menuName2 = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault().Name; } // // var dto = new ProductGroupMappingDto() { ProductGroupMappingID = mapping.ProductGroupMappingID, Depth = mapping.Depth, Lineage = mapping.Lineage, Name = menuName2 //Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name }; dtos.Add(dto); }); return(dtos); } List <int> levels = new List <int>() { -1 }; if (!string.IsNullOrEmpty(lineage)) { var lvs = lineage.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); levels.AddRange((from c in lvs select int.Parse(c)).ToList()); } List <ProductGroupMappingDto> result = new List <ProductGroupMappingDto>(); levels.ForEach((lv, idx) => { int level = lv; int?parentID = null; if (idx > 0) { parentID = levels.ElementAt(idx); } var mapps = objects.Where(c => (parentID.HasValue ? parentID.Value == c.ParentProductGroupMappingID : c.ParentProductGroupMappingID == null)).ToList(); mapps.ForEach((mapping, ix) => { //testing var checkExcists = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID); string menuName; if (checkExcists != null) { menuName = checkExcists.Name; } else { menuName = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault().Name; } // // var dto = new ProductGroupMappingDto() { ProductGroupMappingID = mapping.ProductGroupMappingID, Depth = mapping.Depth, Lineage = mapping.Lineage, //Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name Name = menuName }; if (parentID == null) { result.Add(dto); } else { AttachChildByLineage(dto, parentID.Value, result, levels, levels[1]); } }); }); return(result); }
public List <ProductGroupMappingDto> Search(string query, bool languageSpecific = true, int levels = -1, int?connectorID = null) { if (!connectorID.HasValue) { connectorID = Client.User.ConnectorID; } List <ProductDescription> decs = new List <ProductDescription>(); if (connectorID.HasValue) { decs = Repository <ProductDescription>().GetAll(l => l.Product.ContentProducts.Any(m => m.ConnectorID == connectorID.Value)).ToList(); } else { decs = Repository <ProductDescription>().GetAll().ToList(); } /** * 1) Search within all content products * 2) Build hierarchy * 3) Record the already loaded product group mapping levels * 4) Search within the rest of the product group mappings * 5) Build hierarchy from them */ List <ProductGroupMappingDto> result = new List <ProductGroupMappingDto>(); //Record the loaded product group mappings List <int> searchedProductGroupMappingIDs = new List <int>(); //search within the product hierarchy var matched = (from c in decs where c.ProductName.Contains(query) || c.ShortContentDescription.Contains(query) || c.Product.VendorAssortments.Any(v => v.ShortDescription.Contains(query)) select c.Product).ToList(); Dictionary <int, ProductGroupMappingDto> cacher = new Dictionary <int, ProductGroupMappingDto>(); matched.ForEach(product => { //loop the pgms and cache them product.ContentProductGroups.ForEach((content, idx) => { var name = product.ProductDescriptions.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Description; ProductGroupMappingDto dto = null; cacher.TryGetValue(content.ProductGroupMappingID, out dto); if (dto == null) //not cached yet. Create and cache { ProductGroupMapping mapping = Repository().GetSingle(c => c.ProductGroupMappingID == content.ProductGroupMappingID); searchedProductGroupMappingIDs.Add(mapping.ProductGroupMappingID); dto = new ProductGroupMappingDto() { Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name, ProductGroupMappingID = mapping.ProductGroupMappingID, Depth = mapping.Depth, Lineage = mapping.Lineage, Products = new List <ProductDto>() { new ProductDto() { Name = name, ProductID = product.ProductID } } }; cacher.Add(content.ProductGroupMappingID, dto); } else { dto.Products.Add(new ProductDto() { Name = name, ProductID = product.ProductID }); } }); }); cacher.ForEach((pair, idx) => { var mapping = Repository().GetSingle(c => c.ProductGroupMappingID == pair.Value.ProductGroupMappingID); result.Add(BuildUp(pair.Value, mapping, c => searchedProductGroupMappingIDs.Add(c.ProductGroupMappingID))); }); //start on mappings var mappingMatches = (from m in Repository().GetAllAsQueryable() where m.ProductGroup.ProductGroupLanguages.Any(c => c.Name.Contains(query)) select m).Distinct().ToList(); mappingMatches.RemoveAll(c => searchedProductGroupMappingIDs.Contains(c.ProductGroupMappingID)); mappingMatches.ForEach(mapping => { ProductGroupMappingDto dto = new ProductGroupMappingDto() { Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name, ProductGroupMappingID = mapping.ProductGroupMappingID, Lineage = mapping.Lineage, Depth = mapping.Depth }; result.Add(BuildUp(dto, mapping)); }); return(result); }