Aggregation.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\SearchAdapter\Query\Builder;
  7. use Magento\Framework\Search\Request\BucketInterface;
  8. use Magento\Framework\Search\RequestInterface;
  9. use Magento\Elasticsearch\Model\Adapter\FieldMapperInterface;
  10. /**
  11. * @api
  12. * @since 100.1.0
  13. */
  14. class Aggregation
  15. {
  16. /**
  17. * Max number of results returned per single term bucket, i.e. limit of options for layered navigation filter.
  18. * Default ElasticSearch limit is 10
  19. *
  20. * @var int
  21. */
  22. private static $maxTermBacketSize = 500;
  23. /**
  24. * @var FieldMapperInterface
  25. * @since 100.1.0
  26. */
  27. protected $fieldMapper;
  28. /**
  29. * @param FieldMapperInterface $fieldMapper
  30. */
  31. public function __construct(
  32. FieldMapperInterface $fieldMapper
  33. ) {
  34. $this->fieldMapper = $fieldMapper;
  35. }
  36. /**
  37. * Build aggregation query for request
  38. *
  39. * @param RequestInterface $request
  40. * @param array $searchQuery
  41. * @return array
  42. * @since 100.1.0
  43. */
  44. public function build(
  45. RequestInterface $request,
  46. array $searchQuery
  47. ) {
  48. $buckets = $request->getAggregation();
  49. foreach ($buckets as $bucket) {
  50. $searchQuery = $this->buildBucket($searchQuery, $bucket);
  51. }
  52. return $searchQuery;
  53. }
  54. /**
  55. * Build aggregation query for bucket
  56. *
  57. * @param array $searchQuery
  58. * @param BucketInterface $bucket
  59. * @return array
  60. * @since 100.1.0
  61. */
  62. protected function buildBucket(
  63. array $searchQuery,
  64. BucketInterface $bucket
  65. ) {
  66. $field = $this->fieldMapper->getFieldName($bucket->getField());
  67. switch ($bucket->getType()) {
  68. case BucketInterface::TYPE_TERM:
  69. $searchQuery['body']['aggregations'][$bucket->getName()]= [
  70. 'terms' => [
  71. 'field' => $field,
  72. 'size' => self::$maxTermBacketSize,
  73. ],
  74. ];
  75. break;
  76. case BucketInterface::TYPE_DYNAMIC:
  77. $searchQuery['body']['aggregations'][$bucket->getName()]= [
  78. 'extended_stats' => [
  79. 'field' => $field,
  80. ],
  81. ];
  82. break;
  83. }
  84. return $searchQuery;
  85. }
  86. }