diff --git a/Aggregation/GeoDistanceAggregation.php b/Aggregation/GeoDistanceAggregation.php new file mode 100644 index 0000000000000000000000000000000000000000..c1e4906a51fa9000beb279c08a5a1d44401d1a74 --- /dev/null +++ b/Aggregation/GeoDistanceAggregation.php @@ -0,0 +1,158 @@ +<?php + +/* + * This file is part of the ONGR package. + * + * (c) NFQ Technologies UAB <info@nfq.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\DSL\Aggregation; + +use ONGR\ElasticsearchBundle\DSL\Aggregation\Type\BucketingTrait; + +/** + * Class representing geo distance aggregation. + */ +class GeoDistanceAggregation extends AbstractAggregation +{ + use BucketingTrait; + + /** + * @var mixed + */ + private $origin; + + /** + * @var string + */ + private $distanceType; + + /** + * @var string + */ + private $unit; + + /** + * @var array + */ + private $ranges = []; + + /** + * @return string + */ + public function getOrigin() + { + return $this->origin; + } + + /** + * @param mixed $origin + */ + public function setOrigin($origin) + { + $this->origin = $origin; + } + + /** + * @return string + */ + public function getDistanceType() + { + return $this->distanceType; + } + + /** + * @param string $distanceType + */ + public function setDistanceType($distanceType) + { + $this->distanceType = $distanceType; + } + + /** + * @return string + */ + public function getUnit() + { + return $this->unit; + } + + /** + * @param string $unit + */ + public function setUnit($unit) + { + $this->unit = $unit; + } + + /** + * Add range to aggregation. + * + * @param int|float|null $from + * @param int|float|null $to + * + * @throws \LogicException + * + * @return GeoDistanceAggregation + */ + public function addRange($from = null, $to = null) + { + $range = array_filter( + [ + 'from' => $from, + 'to' => $to, + ] + ); + + if (empty($range)) { + throw new \LogicException('Either from or to must be set. Both cannot be null.'); + } + + $this->ranges[] = $range; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getArray() + { + $data = []; + + if ($this->getField()) { + $data['field'] = $this->getField(); + } else { + throw new \LogicException('Geo distance aggregation must have a field set.'); + } + + if ($this->getOrigin()) { + $data['origin'] = $this->getOrigin(); + } else { + throw new \LogicException('Geo distance aggregation must have an origin set.'); + } + + if ($this->getUnit()) { + $data['unit'] = $this->getUnit(); + } + + if ($this->getDistanceType()) { + $data['distance_type'] = $this->getDistanceType(); + } + + $data['ranges'] = $this->ranges; + + return $data; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'geo_distance'; + } +}