diff --git a/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php new file mode 100644 index 0000000000000000000000000000000000000000..632f0b59f778b641fd0ed66bcff4cc83a4e91f1a --- /dev/null +++ b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php @@ -0,0 +1,81 @@ +<?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\ElasticsearchDSL\Aggregation\Bucketing; + +use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation; +use ONGR\ElasticsearchDSL\Aggregation\Type\BucketingTrait; +use ONGR\ElasticsearchDSL\BuilderInterface; + +/** + * Class representing adjacency matrix aggregation. + * + * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-adjacency-matrix-aggregation.html + */ +class AdjacencyMatrixAggregation extends AbstractAggregation +{ + const FILTERS = 'filters'; + + use BucketingTrait; + + /** + * @var BuilderInterface[] + */ + private $filters = [ + self::FILTERS => [] + ]; + + /** + * Inner aggregations container init. + * + * @param string $name + * @param BuilderInterface[] $filters + */ + public function __construct($name, $filters = []) + { + parent::__construct($name); + + foreach ($filters as $name => $filter) { + $this->addFilter($name, $filter); + } + } + + /** + * @param string $name + * @param BuilderInterface $filter + * + * @throws \LogicException + * + * @return self + */ + public function addFilter($name, BuilderInterface $filter) + { + $this->filters[self::FILTERS][$name] = $filter->toArray(); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getArray() + { + return $this->filters; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'adjacency_matrix'; + } +} diff --git a/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b39c638ad23377ccd925472247d3b6316f070fc8 --- /dev/null +++ b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php @@ -0,0 +1,134 @@ +<?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\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation; + +use ONGR\ElasticsearchDSL\Aggregation\Bucketing\AdjacencyMatrixAggregation; +use ONGR\ElasticsearchDSL\BuilderInterface; + +/** + * Unit test for adjacency matrix aggregation. + */ +class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase +{ +// /** +// * Test if exception is thrown when not anonymous filter is without name. +// * +// * @expectedException \LogicException +// * @expectedExceptionMessage In not anonymous filters filter name must be set. +// */ +// public function testIfExceptionIsThrown() +// { +// $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock(); +// $aggregation = new FiltersAggregation('test_agg'); +// $aggregation->addFilter($mock); +// } + + /** + * Test GetArray method. + */ + public function testFiltersAggregationGetArray() + { + $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock(); + $aggregation = new AdjacencyMatrixAggregation('test_agg'); + $aggregation->addFilter('name', $mock); + $result = $aggregation->getArray(); + $this->assertArrayHasKey('filters', $result); + } + + /** + * Tests getType method. + */ + public function testFiltersAggregationGetType() + { + $aggregation = new AdjacencyMatrixAggregation('foo'); + $result = $aggregation->getType(); + $this->assertEquals('adjacency_matrix', $result); + } + + /** + * Test for filter aggregation toArray() method. + */ + public function testToArray() + { + $aggregation = new AdjacencyMatrixAggregation('test_agg'); + $filter = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface') + ->setMethods(['toArray', 'getType']) + ->getMockForAbstractClass(); + $filter->expects($this->any()) + ->method('toArray') + ->willReturn(['test_field' => ['test_value' => 'test']]); + + $aggregation->addFilter('first', $filter ); + $aggregation->addFilter('second', $filter ); + + $results = $aggregation->toArray(); + $expected = [ + 'adjacency_matrix' => [ + 'filters' => [ + 'first' => [ + 'test_field' => [ + 'test_value' => 'test', + ], + ], + 'second' => [ + 'test_field' => [ + 'test_value' => 'test', + ], + ], + ], + ], + ]; + $this->assertEquals($expected, $results); + } + + /** + * Tests if filters can be passed to the constructor. + */ + public function testFilterConstructor() + { + /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface1 */ + $builderInterface1 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface'); + /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface2 */ + $builderInterface2 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface'); + + $aggregation = new AdjacencyMatrixAggregation( + 'test', + [ + 'filter1' => $builderInterface1, + 'filter2' => $builderInterface2, + ] + ); + + $this->assertSame( + [ + 'adjacency_matrix' => [ + 'filters' => [ + 'filter1' => null, + 'filter2' => null, + ], + ], + ], + $aggregation->toArray() + ); + + $aggregation = new AdjacencyMatrixAggregation('test'); + + $this->assertSame( + [ + 'adjacency_matrix' => [ + 'filters' => [], + ], + ], + $aggregation->toArray() + ); + } +}