From db57301ddd5f0841a9e4c1c211ec96537a15d663 Mon Sep 17 00:00:00 2001
From: Bohuslav Simek <bohuslav.simek@intraworlds.com>
Date: Sun, 26 May 2019 11:47:04 +0200
Subject: [PATCH] Add suport for size and after property into composite
 aggregation

---
 .../Bucketing/CompositeAggregation.php        | 66 ++++++++++++++++++-
 .../Bucketing/CompositeAggregationTest.php    | 48 ++++++++++++++
 2 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/src/Aggregation/Bucketing/CompositeAggregation.php b/src/Aggregation/Bucketing/CompositeAggregation.php
index d36c900..5489efc 100644
--- a/src/Aggregation/Bucketing/CompositeAggregation.php
+++ b/src/Aggregation/Bucketing/CompositeAggregation.php
@@ -29,6 +29,16 @@ class CompositeAggregation extends AbstractAggregation
      */
     private $sources = [];
 
+    /**
+     * @var int
+     */
+    private $size;
+
+    /**
+     * @var array
+     */
+    private $after;
+
     /**
      * Inner aggregations container init.
      *
@@ -65,9 +75,19 @@ class CompositeAggregation extends AbstractAggregation
      */
     public function getArray()
     {
-        return [
+        $array = [
             'sources' => $this->sources,
         ];
+
+        if ($this->size !== null) {
+            $array['size'] = $this->size;
+        }
+
+        if (!empty($this->after)) {
+            $array['after'] = $this->after;
+        }
+
+        return $array;
     }
 
     /**
@@ -77,4 +97,48 @@ class CompositeAggregation extends AbstractAggregation
     {
         return 'composite';
     }
+
+    /**
+     * Sets size
+     *
+     * @param int $size Size
+     *
+     * @return void
+     */
+    public function setSize($size)
+    {
+        $this->size = $size;
+    }
+
+    /**
+     * Returns size
+     *
+     * @return int
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * Sets after
+     *
+     * @param array $after After
+     *
+     * @return void
+     */
+    public function setAfter(array $after)
+    {
+        $this->after = $after;
+    }
+
+    /**
+     * Returns after
+     *
+     * @return array
+     */
+    public function getAfter()
+    {
+        return $this->after;
+    }
 }
diff --git a/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php b/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
index d109532..b3bd625 100644
--- a/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
@@ -38,6 +38,54 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals($expectedResult, $compositeAgg->toArray());
     }
 
+    /**
+     * Test for composite aggregation toArray() method with size and after part.
+     */
+    public function testToArrayWithSizeAndAfter()
+    {
+        $compositeAgg = new CompositeAggregation('composite_test_agg');
+        $termsAgg = new TermsAggregation('test_term_agg', 'test_field');
+        $compositeAgg->addSource($termsAgg);
+        $compositeAgg->setSize(5);
+        $compositeAgg->setAfter(['test_term_agg' => 'test']);
+
+        $expectedResult = [
+            'composite' => [
+                'sources' =>  [
+                    [
+                        'test_term_agg' => [ 'terms' => ['field' => 'test_field'] ],
+                    ]
+                ],
+                'size' => 5,
+                'after' => ['test_term_agg' => 'test']
+            ],
+        ];
+
+        $this->assertEquals($expectedResult, $compositeAgg->toArray());
+    }
+
+    /**
+     * Test for composite aggregation getSize() method.
+     */
+    public function testGetSize()
+    {
+        $compositeAgg = new CompositeAggregation('composite_test_agg');
+        $compositeAgg->setSize(5);
+
+        $this->assertEquals(5, $compositeAgg->getSize());
+    }
+
+    /**
+     * Test for composite aggregation getAfter() method.
+     */
+    public function testGetAfter()
+    {
+        $compositeAgg = new CompositeAggregation('composite_test_agg');
+        $compositeAgg->setAfter(['test_term_agg' => 'test']);
+
+        $this->assertEquals(['test_term_agg' => 'test'], $compositeAgg->getAfter());
+    }
+
     /**
      * Tests getType method.
      */
-- 
GitLab