예제 #1
0
            private static EntityDataServiceResponse <ProductVariant> GetVariantsByDimensionIds(GetVariantsByDimensionIdsDataRequest request)
            {
                IEnumerable <string> inventoryDimensionIds = request.InventoryDimensionIds;
                RequestContext       context = request.RequestContext;

                ThrowIf.Null(inventoryDimensionIds, "inventoryDimensionIds");
                ThrowIf.Null(context, "context");

                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(context);

                bool found;
                bool updateL2Cache;
                ReadOnlyCollection <ProductVariant> result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetVariantsByDimensionIds(inventoryDimensionIds), out found, out updateL2Cache);

                if (!found)
                {
                    if (inventoryDimensionIds.Any())
                    {
                        var settings = new QueryResultSettings(PagingInfo.CreateWithExactCount(inventoryDimensionIds.Count(), 0));

                        var query = new SqlPagedQuery(settings)
                        {
                            Select = new ColumnSet(),
                            From   = InventDimViewName,
                            Where  = string.Format("{0} = {1}", DataAreaIdColumnName, DataAreaIdVariableName)
                        };

                        query.Parameters[DataAreaIdVariableName] = context.GetChannelConfiguration().InventLocationDataAreaId;

                        using (StringIdTableType type = new StringIdTableType(inventoryDimensionIds, InventDimIdColumnName))
                        {
                            query.Parameters[ItemIdTableTypeVariableName] = type;

                            using (DatabaseContext databaseContext = new DatabaseContext(context))
                            {
                                result = databaseContext.ReadEntity <ProductVariant>(query).Results;
                            }
                        }
                    }
                    else
                    {
                        result = new ReadOnlyCollection <ProductVariant>(new ProductVariant[0]);
                    }

                    updateL2Cache &= result != null &&
                                     result.Count < MaxCachedCollectionSize;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutVariantDimensionsByItemIds(inventoryDimensionIds, result);
                }

                return(new EntityDataServiceResponse <ProductVariant>(result.AsPagedResult()));
            }
            private static EntityDataServiceResponse <ProductVariant> GetProductVariants(GetProductVariantsDataRequest request)
            {
                IEnumerable <ItemVariantInventoryDimension> itemVariants = request.ItemAndInventoryDimensionIds;
                RequestContext context = request.RequestContext;

                ThrowIf.Null(itemVariants, "itemVariants");
                ThrowIf.Null(context, "context");

                ColumnSet columnSet = new ColumnSet();
                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(context);

                bool found;
                bool updateL2Cache;
                ReadOnlyCollection <ProductVariant> result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetVariants(itemVariants, columnSet), out found, out updateL2Cache);

                if (!found)
                {
                    var query = new SqlPagedQuery(QueryResultSettings.AllRecords)
                    {
                        Select = columnSet,
                        From   = GetVariantsByItemIdAndInventDimIdFunctionName
                    };

                    using (var type = new ItemVariantInventoryDimensionTableType(itemVariants))
                    {
                        query.Parameters[DatabaseAccessor.ChannelIdVariableName]   = context.GetPrincipal().ChannelId;
                        query.Parameters[DatabaseAccessor.ChannelDateVariableName] = context.GetNowInChannelTimeZone().Date;
                        query.Parameters[ItemVariantIdsVariableName] = type.DataTable;

                        using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(context))
                        {
                            result = databaseContext.ReadEntity <ProductVariant>(query).Results;
                        }
                    }

                    updateL2Cache &= result != null;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutVariants(itemVariants, columnSet, result);
                }

                return(new EntityDataServiceResponse <ProductVariant>(result.AsPagedResult()));
            }
예제 #3
0
            private static EntityDataServiceResponse <RetailCategoryMember> GetRetailCategoryMembersForItems(GetRetailCategoryMembersForItemsDataRequest request)
            {
                RequestContext context             = request.RequestContext;
                ISet <long>    productOrVariantIds = request.ProductOrVariantIds;

                ThrowIf.Null(productOrVariantIds, "productOrVariantIds");
                ThrowIf.Null(context, "context");

                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(context);

                bool found;
                bool updateL2Cache;
                ReadOnlyCollection <RetailCategoryMember> result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetRetailCategoryMembersForItems(productOrVariantIds), out found, out updateL2Cache);

                if (!found)
                {
                    SqlPagedQuery query = new SqlPagedQuery(QueryResultSettings.AllRecords)
                    {
                        Select = new ColumnSet(),
                        From   = RetailCategoryMembersForItemsViewName
                    };

                    using (RecordIdTableType type = new RecordIdTableType(productOrVariantIds, CommerceEntityExtensions.GetColumnName <RetailCategoryMember>(e => e.ProductOrVariantId)))
                    {
                        query.Parameters[RecordIdTableTypeVariableName] = type;

                        using (DatabaseContext databaseContext = new DatabaseContext(context))
                        {
                            result = databaseContext.ReadEntity <RetailCategoryMember>(query).Results;
                        }
                    }

                    updateL2Cache &= result != null;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutRetailCategoryMembersForItems(productOrVariantIds, result);
                }

                return(new EntityDataServiceResponse <RetailCategoryMember>(result.AsPagedResult()));
            }
예제 #4
0
            private static SingleEntityDataServiceResponse <ItemMaxRetailPriceIndia> GetItemMaxRetailPrice(GetItemMaxRetailPriceDataRequest request)
            {
                string         itemId  = request.ItemId;
                RequestContext context = request.RequestContext;

                ThrowIf.Null(itemId, "itemId");
                ThrowIf.Null(context, "context");
                ColumnSet columnSet = request.QueryResultSettings != null ? request.QueryResultSettings.ColumnSet : new ColumnSet();

                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(context);

                bool found;
                bool updateL2Cache;
                ItemMaxRetailPriceIndia result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetItemMaxRetailPrice(itemId, columnSet), out found, out updateL2Cache);

                if (!found)
                {
                    var query = new SqlPagedQuery(QueryResultSettings.SingleRecord)
                    {
                        Select = columnSet,
                        From   = ItemsMaxRetailPricesIndiaViewName,
                        Where  = string.Format("{0} = {1} AND {2} = {3}", ItemIdColumnName, ItemIdVariableName, DataAreaIdColumnName, DataAreaIdVariableName),
                    };

                    query.Parameters[ItemIdVariableName]     = itemId;
                    query.Parameters[DataAreaIdVariableName] = context.GetChannelConfiguration().InventLocationDataAreaId;

                    using (DatabaseContext databaseContext = new DatabaseContext(context))
                    {
                        result = databaseContext.ReadEntity <ItemMaxRetailPriceIndia>(query).SingleOrDefault();
                    }

                    updateL2Cache &= result != null;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutItemMaxRetailPrice(itemId, columnSet, result);
                }

                return(new SingleEntityDataServiceResponse <ItemMaxRetailPriceIndia>(result));
            }
            /// <summary>
            /// Gets the items using the specified item identifiers.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="itemIds">The list of item identifiers.</param>
            /// <param name="settings">The query result settings.</param>
            /// <returns>The collection of items.</returns>
            private static ReadOnlyCollection <Item> GetItems(RequestContext context, IEnumerable <string> itemIds, QueryResultSettings settings)
            {
                ThrowIf.Null(context, "context");
                ThrowIf.Null(itemIds, "itemIds");
                ThrowIf.Null(settings, "settings");

                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(context);

                bool found;
                bool updateL2Cache;
                ReadOnlyCollection <Item> result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetItems(itemIds, settings), out found, out updateL2Cache);

                if (!found)
                {
                    using (StringIdTableType type = new StringIdTableType(itemIds, "ITEMID"))
                    {
                        var parameters = new ParameterSet();
                        parameters[DatabaseAccessor.ChannelIdVariableName]   = context.GetPrincipal().ChannelId;
                        parameters[DatabaseAccessor.ChannelDateVariableName] = context.GetNowInChannelTimeZone().DateTime;
                        parameters[ItemIdsVariableName] = type.DataTable;

                        using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(context, settings))
                        {
                            result = databaseContext.ExecuteStoredProcedure <Item>(GetItemsByItemIdsSprocName, parameters).Results;
                        }
                    }

                    updateL2Cache &= result != null &&
                                     result.Count < MaxCachedCollectionSize;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutItems(itemIds, settings, result);
                }

                return(result);
            }
예제 #6
0
            private static GetProductBarcodeDataResponse GetProductBarcodeData(GetProductBarcodeDataRequest request)
            {
                string         barcode = request.Barcode;
                RequestContext context = request.RequestContext;

                ThrowIf.Null(barcode, "barcode");
                ThrowIf.Null(context, "context");
                ColumnSet columns = request.QueryResultSettings != null ? request.QueryResultSettings.ColumnSet : new ColumnSet();

                ItemL2CacheDataStoreAccessor level2CacheDataAccessor = GetCacheAccessor(request.RequestContext);

                bool        found;
                bool        updateL2Cache;
                ItemBarcode result = DataManager.GetDataFromCache(() => level2CacheDataAccessor.GetItemsByBarcode(barcode, columns), out found, out updateL2Cache);

                if (!found)
                {
                    var query = new SqlPagedQuery(QueryResultSettings.AllRecords)
                    {
                        Select = columns,
                        From   = BarcodesViewName,
                        Where  = string.Format("{0} LIKE {1} AND {2} = {3}", ItemBarcodeColumnName, ItemBarcodeVariableName, DataAreaIdColumnName, DataAreaIdVariableName),
                    };

                    query.Parameters[ItemBarcodeVariableName] = barcode;
                    query.Parameters[DataAreaIdVariableName]  = context.GetChannelConfiguration().InventLocationDataAreaId;

                    IEnumerable <ItemBarcode> itemBarcodes;
                    using (DatabaseContext databaseContext = new DatabaseContext(context))
                    {
                        itemBarcodes = databaseContext.ReadEntity <ItemBarcode>(query).Results;
                    }

                    // If the barcode matches with more than one variant, then we should set the variant details to null/ empty.
                    // When this scenario occurs, the client should pop up new dialog to get the variant details.
                    if (itemBarcodes.Count() > 1)
                    {
                        ItemBarcode itemBarcode = itemBarcodes.FirstOrDefault();

                        if (itemBarcode != null)
                        {
                            itemBarcode.SetVariantDetailsToEmpty();

                            result = itemBarcode;
                        }
                    }
                    else
                    {
                        using (DatabaseContext databaseContext = new DatabaseContext(context))
                        {
                            result = databaseContext.ReadEntity <ItemBarcode>(query).SingleOrDefault();
                        }
                    }

                    updateL2Cache &= result != null;
                }

                if (updateL2Cache)
                {
                    level2CacheDataAccessor.PutItemsByBarcode(barcode, columns, result);
                }

                return(new GetProductBarcodeDataResponse(result));
            }