Reworking stock post processor and stock_item resolver as batch contracts#30
Reworking stock post processor and stock_item resolver as batch contracts#30aleksandrsm wants to merge 2 commits intoscandipwa:masterfrom
Conversation
|
Taking note not to merge them now. We will test everything in a separate instance first. |
| || $this->isSingleSourceMode->execute() | ||
| || !$this->isSourceItemManagementAllowedForSku->execute($sku) |
There was a problem hiding this comment.
Sometimes while fetching products in PLP we get Error and can't get the products, these 2 methods are null in these cases and can't execute.
In some categories everything is okay, example
For other the error occurs, example
Endpoint: https://scandipwapmrevprtest-dev.indvp.com/graphql (Access with VPN)
Full GraphQL Query:
query ( $sort_1: ProductAttributeSortInput! $filter_1: ProductAttributeFilterInput! $pageSize_1: Int! $currentPage_1: Int! ) { products( sort: $sort_1 filter: $filter_1 pageSize: $pageSize_1 currentPage: $currentPage_1 ) { total_count items { uid id sku name type_id stock_status salable_qty stock_item { min_sale_qty max_sale_qty qty_increments } price_range { minimum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } maximum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } } image { path url } thumbnail { path url } small_image { path url } short_description { html } special_from_date special_to_date price_tiers { discount { amount_off percent_off } final_price { currency value } quantity } attributes: s_attributes { attribute_id attribute_value attribute_code attribute_label attribute_type attribute_group_id attribute_group_name attribute_options { label value swatch_data { type value } } } url url_rewrites { url } review_count rating_summary ... on CustomizableProductInterface { options { ... on CustomizableDropDownOption { dropdownValues: value { uid option_type_id price priceInclTax priceExclTax price_type currency sku title sort_order } } ... on CustomizableRadioOption { dropdownValues: value { uid option_type_id price priceInclTax priceExclTax price_type currency sku title sort_order } } ... on CustomizableCheckboxOption { checkboxValues: value { uid option_type_id price priceInclTax priceExclTax price_type currency sku title sort_order } } ... on CustomizableMultipleOption { checkboxValues: value { uid option_type_id price priceInclTax priceExclTax price_type currency sku title sort_order } } ... on CustomizableFieldOption { fieldValues: value { price priceInclTax priceExclTax price_type currency sku max_characters } product_sku } ... on CustomizableAreaOption { areaValues: value { price priceInclTax priceExclTax price_type currency sku max_characters } product_sku } ... on CustomizableFileOption { fileValues: value { price priceInclTax priceExclTax price_type currency sku file_extension } } ... on CustomizableDateOption { value { price priceInclTax priceExclTax price_type currency sku } product_sku } title required sort_order type uid } } ... on ConfigurableProduct { configurable_options { attribute_code values { value_index } } variants: variants_plp { product { uid id sku name type_id stock_status salable_qty stock_item { min_sale_qty max_sale_qty qty_increments } price_range { minimum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } maximum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } } attributes: s_attributes { attribute_id attribute_value attribute_code attribute_label attribute_type attribute_group_id attribute_group_name } } } } ... on BundleProduct { dynamic_price dynamic_sku ship_bundle_items dynamic_weight items { uid option_id title required type position sku options { uid label quantity position is_default price price_type can_change_quantity product { name stock_status price_range { minimum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } maximum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } } } } } bundle_options { option_id selection_details { selection_id final_option_price final_option_price_excl_tax regular_option_price regular_option_price_excl_tax } } } ... on GroupedProduct { items { product { uid id sku name type_id stock_status salable_qty stock_item { min_sale_qty max_sale_qty qty_increments } price_range { minimum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } maximum_price { discount { amount_off percent_off } final_price { currency value } final_price_excl_tax { currency value } regular_price { currency value } regular_price_excl_tax { currency value } default_price { currency value } default_final_price { currency value } default_final_price_excl_tax { currency value } } } attributes: s_attributes { attribute_id attribute_value attribute_code attribute_label attribute_type attribute_group_id attribute_group_name } } position qty } } ... on DownloadableProduct { links_purchased_separately } } page_info { current_page total_pages } } }
Variables:
{ "sort_1": { "name": "ASC" }, "filter_1": { "price": {}, "category_id": { "eq": 40 }, "customer_group_id": { "eq": "0" } }, "pageSize_1": 24, "currentPage_1": 1, "_currency": "" }
| $skusToCheck = array_flip($skuArray); | ||
|
|
||
| foreach ($skuArray as $sku) { | ||
| if ($this->isSourceItemManagementAllowedForSku->execute($sku)) { |
There was a problem hiding this comment.
Argument #1 ($sku) must be of type string, int given, I think here typecasting is needed
There was a problem hiding this comment.
The sku's come from AreProductsSalable service, its unprocessedSkuQueue
public function addSkuToQueue(string $sku): void
^it already is type casted, did you get an actual int here, somehow, or is this an IDE warning?
There was a problem hiding this comment.
I got this error from system.log in the instance
There was a problem hiding this comment.
Clear, wonder how the hell it got here. Will add type casting just in case, thanks
|
@AzizKHAN030 |
To go together with scandipwa/catalog-graphql#141
Requires FE change, to not query
in_stockfield onstock_item.Implemented new
StockStatusbatch service contract resolver.The logic of
AreProductsSalableConditionChainis following the core M2 logic ofIsProductSalableConditionChainforfrontendarea, but is refactored to support grouped requests at (almost) every step.Alternatives for MSI/M2 plugins on the corresponding core classes implemented as part of code directly.
Note: by default, M2 was creating a new instance of a batch service contract wrapper for each product type(so it'd group stock request for simple products separately from configurable, bundle, etc..). Implemented a workaround with an internal request queue on the services.
Moved
stock_itemresolver from CatalogGraphQl module / replaced with a batch service contract that re-uses stock item data cache from the newstock_statusresolver.