FullTextSearchCheck.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogSearch\Model\Search\QueryChecker;
  7. use Magento\Framework\Search\Request\QueryInterface;
  8. use Magento\Framework\Search\Request\Query\BoolExpression;
  9. use Magento\Framework\Search\Request\Query\Filter;
  10. /**
  11. * Class is responsible for checking if fulltext search is required for search query
  12. *
  13. * @deprecated 101.0.0
  14. * @see \Magento\ElasticSearch
  15. */
  16. class FullTextSearchCheck
  17. {
  18. /**
  19. * Checks if $query requires full text search
  20. *
  21. * This is required to determine whether we need
  22. * to join catalog_eav_attribute table to search query or not
  23. *
  24. * In case when the $query does not requires full text search
  25. * - we can skip joining catalog_eav_attribute table because it becomes excessive
  26. *
  27. * @param QueryInterface $query
  28. * @return bool
  29. * @throws \InvalidArgumentException
  30. */
  31. public function isRequiredForQuery(QueryInterface $query)
  32. {
  33. return $this->processQuery($query);
  34. }
  35. /**
  36. * Process query
  37. *
  38. * @param QueryInterface $query
  39. * @return bool
  40. * @throws \InvalidArgumentException
  41. */
  42. private function processQuery(QueryInterface $query)
  43. {
  44. switch ($query->getType()) {
  45. case QueryInterface::TYPE_MATCH:
  46. return true;
  47. break;
  48. case QueryInterface::TYPE_BOOL:
  49. return $this->processBoolQuery($query);
  50. break;
  51. case QueryInterface::TYPE_FILTER:
  52. return $this->processFilterQuery($query);
  53. break;
  54. default:
  55. throw new \InvalidArgumentException(sprintf('Unknown query type \'%s\'', $query->getType()));
  56. }
  57. }
  58. /**
  59. * Process boolean query
  60. *
  61. * @param BoolExpression $query
  62. * @return bool
  63. * @throws \InvalidArgumentException
  64. */
  65. private function processBoolQuery(BoolExpression $query)
  66. {
  67. foreach ($query->getShould() as $shouldQuery) {
  68. if ($this->processQuery($shouldQuery)) {
  69. return true;
  70. }
  71. }
  72. foreach ($query->getMust() as $mustQuery) {
  73. if ($this->processQuery($mustQuery)) {
  74. return true;
  75. }
  76. }
  77. foreach ($query->getMustNot() as $mustNotQuery) {
  78. if ($this->processQuery($mustNotQuery)) {
  79. return true;
  80. }
  81. }
  82. return false;
  83. }
  84. /**
  85. * Process filter query
  86. *
  87. * @param Filter $query
  88. * @return bool
  89. * @throws \InvalidArgumentException
  90. */
  91. private function processFilterQuery(Filter $query)
  92. {
  93. switch ($query->getReferenceType()) {
  94. case Filter::REFERENCE_QUERY:
  95. return $this->processQuery($query->getReference());
  96. break;
  97. case Filter::REFERENCE_FILTER:
  98. return false;
  99. break;
  100. default:
  101. throw new \InvalidArgumentException(
  102. sprintf(
  103. 'Unknown reference type \'%s\'',
  104. $query->getReferenceType()
  105. )
  106. );
  107. }
  108. }
  109. }