Search.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Search;
  7. use Magento\Framework\Api\Search\SearchInterface;
  8. use Magento\Framework\Api\Search\SearchCriteriaInterface;
  9. use Magento\Framework\App\ScopeResolverInterface;
  10. use Magento\Framework\Search\Request\Builder;
  11. class Search implements SearchInterface
  12. {
  13. /**
  14. * @var Builder
  15. */
  16. private $requestBuilder;
  17. /**
  18. * @var ScopeResolverInterface
  19. */
  20. private $scopeResolver;
  21. /**
  22. * @var SearchEngineInterface
  23. */
  24. private $searchEngine;
  25. /**
  26. * @var SearchResponseBuilder
  27. */
  28. private $searchResponseBuilder;
  29. /**
  30. * @param Builder $requestBuilder
  31. * @param ScopeResolverInterface $scopeResolver
  32. * @param SearchEngineInterface $searchEngine
  33. * @param SearchResponseBuilder $searchResponseBuilder
  34. */
  35. public function __construct(
  36. Builder $requestBuilder,
  37. ScopeResolverInterface $scopeResolver,
  38. SearchEngineInterface $searchEngine,
  39. SearchResponseBuilder $searchResponseBuilder
  40. ) {
  41. $this->requestBuilder = $requestBuilder;
  42. $this->scopeResolver = $scopeResolver;
  43. $this->searchEngine = $searchEngine;
  44. $this->searchResponseBuilder = $searchResponseBuilder;
  45. }
  46. /**
  47. * {@inheritdoc}
  48. */
  49. public function search(SearchCriteriaInterface $searchCriteria)
  50. {
  51. $this->requestBuilder->setRequestName($searchCriteria->getRequestName());
  52. $scope = $this->scopeResolver->getScope()->getId();
  53. $this->requestBuilder->bindDimension('scope', $scope);
  54. foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
  55. foreach ($filterGroup->getFilters() as $filter) {
  56. $this->addFieldToFilter($filter->getField(), $filter->getValue());
  57. }
  58. }
  59. $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize());
  60. $this->requestBuilder->setSize($searchCriteria->getPageSize());
  61. $request = $this->requestBuilder->create();
  62. $searchResponse = $this->searchEngine->search($request);
  63. return $this->searchResponseBuilder->build($searchResponse)
  64. ->setSearchCriteria($searchCriteria);
  65. }
  66. /**
  67. * Apply attribute filter to facet collection
  68. *
  69. * @param string $field
  70. * @param string|array|null $condition
  71. * @return $this
  72. */
  73. private function addFieldToFilter($field, $condition = null)
  74. {
  75. if (!is_array($condition) || !in_array(key($condition), ['from', 'to'], true)) {
  76. $this->requestBuilder->bind($field, $condition);
  77. } else {
  78. if (!empty($condition['from'])) {
  79. $this->requestBuilder->bind("{$field}.from", $condition['from']);
  80. }
  81. if (!empty($condition['to'])) {
  82. $this->requestBuilder->bind("{$field}.to", $condition['to']);
  83. }
  84. }
  85. return $this;
  86. }
  87. }