private void Index(Product product, IEnumerable <CultureInfo> cultures) { foreach (var culture in cultures) { var indexer = IndexStores.Get <ProductModel>(CommerceInstance.Current.Name, culture); indexer.Index(ProductModel.Create(product, culture, CategoryTree.Get(CommerceInstance.Current.Name))); indexer.Commit(); } }
private void DeleteIndex(int productId) { var indexer = IndexStores.Get <ProductModel>(CommerceInstance.Current.Name, CultureInfo.InvariantCulture); indexer.Delete(productId); indexer.Commit(); foreach (var lang in _languageStore.All()) { var langIndexer = IndexStores.Get <ProductModel>(CommerceInstance.Current.Name, CultureInfo.GetCultureInfo(lang.Name)); langIndexer.Delete(productId); langIndexer.Commit(); } }
public object Execute(CommerceDataSourceContext context) { var culture = CultureInfo.InvariantCulture; if (!String.IsNullOrEmpty(context.Site.Culture)) { var languageStore = LanguageStores.Get(context.Instance); if (languageStore.Exists(context.Site.Culture)) { culture = CultureInfo.GetCultureInfo(context.Site.Culture); } } var store = IndexStores.Get <ProductModel>(context.Instance, culture); var query = store.Query(); // Apply defined filters if (Filters != null) { query = query.ApplyFilters(ParseFilters(context), culture); } // Apply implicit facet filters repsented in url query IList <Filter> facetFilters = null; if (IncludeFacets && Facets != null && Facets.Count > 0) { facetFilters = GetFacetFilters(context); if (facetFilters.Count > 0) { query = query.ApplyFilters(facetFilters, culture); } } // Apply sorting var sortField = ParameterizedFieldValue.GetFieldValue(SortField, context.ValueProvider); if (!String.IsNullOrEmpty(sortField)) { query.AddOrderBy(sortField); } // Execute result var result = new ProductSearchResult(); var pagination = query.Paginate(EvaluatePageNumber(context) - 1, EvaluatePageSize(context)); result.Total = pagination.TotalItems; result.Products = ToProducts(pagination.Cast <ProductModel>().ToList(), context.Site.Commerce()); // Get facets if (IncludeFacets && Facets != null && Facets.Count > 0) { result.Facets = query.ToFacets(Facets); // Generate facet urls var url = HttpContext.Current.Request.RawUrl; CategoryTree localizedCategoryTree = null; foreach (var facetResult in result.Facets) { // Categories are in tree structure, and all level of categories of a product are indexed for seaier search. // If Category facet is not presented in url query, we should only return the ROOT level categories. // If Category facet is presented in url query, we should only return it's children categories. // Otherwise there'll be too many category results. if (facetResult.Field == FacetDefinition.Category.Field) { if (localizedCategoryTree == null) { localizedCategoryTree = CategoryTree.Get(context.Instance).Localize(culture, "Name"); } var filter = facetFilters.FirstOrDefault(f => f.Name == FacetDefinition.Category.Name); if (filter != null) { var category = localizedCategoryTree.Desendants().FirstOrDefault(c => c.Name == filter.FieldValue); foreach (var value in facetResult.Values.ToList()) { if (!category.Children.Any(c => c.Name == value.Term)) { facetResult.Values.Remove(value); } } } else { foreach (var value in facetResult.Values.ToList()) { if (!localizedCategoryTree.Categories.Any(c => c.Name == value.Term)) { facetResult.Values.Remove(value); } } } } foreach (var value in facetResult.Values) { var paramName = facetResult.Name; value.Url = UrlUtility.RemoveQuery(url, paramName); value.Url = UrlUtility.AddQueryParam(value.Url, paramName, value.Term); } } } return(result); }
private void DoWork(CommerceInstance instance) { IndexStore store = null; try { var rebuildDirectory = IndexStores.GetDirectory(Context.Instance, Context.Culture, Context.ModelType, true); var liveDirectory = IndexStores.GetDirectory(Context.Instance, Context.Culture, Context.ModelType, false); // Ensure temp folder are deleted (last rebuild might encounter errors when deleting the temp folder) Kooboo.IO.IOUtility.DeleteDirectory(rebuildDirectory, true); Kooboo.IO.IOUtility.DeleteDirectory(liveDirectory + "-tmp", true); var total = _source.Count(instance, Context.Culture); var totalRebuilt = 0; Progress = 0; store = new IndexStore(Context.ModelType, FSDirectory.Open(rebuildDirectory), Analyzers.GetAnalyzer(Context.Culture)); foreach (var data in _source.Enumerate(instance, Context.Culture)) { if (_cancelling) { break; } store.Index(data); totalRebuilt++; Progress = (int)Math.Round(totalRebuilt * 100 / (double)total); } if (_cancelling) { store.Dispose(); UpdateTaskInfo(info => { info.ClearError(); info.LastRebuildStatus = RebuildStatus.Cancelled; }); _cancelling = false; _cancelledEvent.Set(); Status = RebuildStatus.Cancelled; } else { store.Commit(); store.Dispose(); UpdateTaskInfo(info => { info.ClearError(); info.LastRebuildStatus = RebuildStatus.Success; info.LastSucceededRebuildTimeUtc = DateTime.UtcNow; }); // Replace old index files with the new ones IndexStores.Close(Context.Instance, Context.Culture, Context.ModelType); var liveDirectoryExists = System.IO.Directory.Exists(liveDirectory); if (liveDirectoryExists) { System.IO.Directory.Move(liveDirectory, liveDirectory + "-tmp"); Kooboo.IO.IOUtility.DeleteDirectory(liveDirectory, true); } System.IO.Directory.Move(rebuildDirectory, liveDirectory); if (liveDirectoryExists) { Kooboo.IO.IOUtility.DeleteDirectory(liveDirectory + "-tmp", true); } Status = RebuildStatus.Success; } Progress = 0; } catch (Exception ex) { if (store != null) { store.Dispose(); } UpdateTaskInfo(info => { info.LastRebuildStatus = RebuildStatus.Failed; info.LastRebuildError = ex.Message; info.LastRebuildErrorDetail = ex.StackTrace; }); Status = RebuildStatus.Failed; } }