in src/Foundation/CommerceServer/code/Helpers/SearchNavigation.cs [412:496]
public static void GetProductStockStatusFromIndex(List<ProductViewModel> viewModelList)
{
if (viewModelList == null || viewModelList.Count == 0)
{
return;
}
var searchManager = ContextTypeLoader.CreateInstance<ICatalogSearchManager>();
var searchIndex = searchManager.GetIndex();
using (var context = searchIndex.CreateSearchContext())
{
var predicate = PredicateBuilder.Create<InventorySearchResultItem>(item => item[StorefrontConstants.KnownIndexFields.InStockLocations].Contains("Default"));
predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.OutOfStockLocations].Contains("Default"));
predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.OrderableLocations].Contains("Default"));
predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.PreOrderable].Contains("0"));
var searchResults = context.GetQueryable<InventorySearchResultItem>()
.Where(item => item.CommerceSearchItemType == CommerceSearchResultItemType.Product)
.Where(item => item.Language == SearchNavigation.CurrentLanguageName)
.Where(BuildProductIdListPredicate(viewModelList))
.Where(predicate)
.Select(x => new { x.OutOfStockLocations, x.OrderableLocations, x.PreOrderable, x.InStockLocations, x.Fields, x.Name });
var results = searchResults.GetResults();
if (results.TotalSearchResults == 0)
{
return;
}
foreach (var result in results)
{
var resultDocument = result.Document;
if (resultDocument == null)
{
continue;
}
StockStatus status;
var isInStock = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.InStockLocations)
&& resultDocument.Fields[StorefrontConstants.KnownIndexFields.InStockLocations] != null;
if (isInStock)
{
status = StockStatus.InStock;
}
else
{
var isPreOrderable = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.PreOrderable)
&& result.Document.PreOrderable != null
&& (result.Document.PreOrderable.Equals("1", StringComparison.OrdinalIgnoreCase)
|| result.Document.PreOrderable.Equals("true", StringComparison.OrdinalIgnoreCase));
if (isPreOrderable)
{
status = StockStatus.PreOrderable;
}
else
{
var isOutOfStock = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.OutOfStockLocations)
&& result.Document.OutOfStockLocations != null;
var isBackOrderable = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.OrderableLocations)
&& result.Document.OrderableLocations != null;
if (isOutOfStock && isBackOrderable)
{
status = StockStatus.BackOrderable;
}
else
{
status = isOutOfStock ? StockStatus.OutOfStock : null;
}
}
}
var foundModel = viewModelList.Find(x => x.ProductId == result.Document.Name);
if (foundModel != null)
{
foundModel.StockStatus = status;
foundModel.StockStatusName = StorefrontManager.GetProductStockStatusName(foundModel.StockStatus);
}
}
}
}