IndexScopeResolver.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Indexer\ScopeResolver;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\App\ScopeResolverInterface;
  9. use Magento\Framework\Search\Request\Dimension;
  10. use Magento\Framework\Search\Request\IndexScopeResolverInterface;
  11. class IndexScopeResolver implements IndexScopeResolverInterface
  12. {
  13. /**
  14. * @var Resource
  15. */
  16. private $resource;
  17. /**
  18. * @var ScopeResolverInterface
  19. */
  20. private $scopeResolver;
  21. /**
  22. * @param ResourceConnection $resource
  23. * @param ScopeResolverInterface $scopeResolver
  24. */
  25. public function __construct(
  26. ResourceConnection $resource,
  27. ScopeResolverInterface $scopeResolver
  28. ) {
  29. $this->resource = $resource;
  30. $this->scopeResolver = $scopeResolver;
  31. }
  32. /**
  33. * @param string $index
  34. * @param Dimension[] $dimensions
  35. * @return string
  36. */
  37. public function resolve($index, array $dimensions)
  38. {
  39. $tableNameParts = [];
  40. foreach ($dimensions as $dimension) {
  41. switch ($dimension->getName()) {
  42. case 'scope':
  43. $tableNameParts[$dimension->getName()] = $dimension->getName() . $this->getScopeId($dimension);
  44. break;
  45. default:
  46. $tableNameParts[$dimension->getName()] = $dimension->getName() . $dimension->getValue();
  47. }
  48. }
  49. ksort($tableNameParts);
  50. array_unshift($tableNameParts, $index);
  51. return $this->resource->getTableName(implode('_', $tableNameParts));
  52. }
  53. /**
  54. * Get scope id by code
  55. *
  56. * @param Dimension $dimension
  57. * @return int
  58. */
  59. private function getScopeId($dimension)
  60. {
  61. $scopeId = $dimension->getValue();
  62. if (!is_numeric($scopeId)) {
  63. $scopeId = $this->scopeResolver->getScope($scopeId)->getId();
  64. }
  65. return $scopeId;
  66. }
  67. }