From a87b190515c253dfed3e24e7d658bcde1cf49461 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mantas=20Urnie=C5=BEa?= <mantas.urnieza@nfq.lt>
Date: Tue, 8 Dec 2015 11:19:36 +0200
Subject: [PATCH] Adding timout and terminate_after parameters to Search
 object.

---
 src/Search.php       | 40 ++++++++++++++++++++++
 tests/SearchTest.php | 79 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+)

diff --git a/src/Search.php b/src/Search.php
index eab145f..fc91a90 100644
--- a/src/Search.php
+++ b/src/Search.php
@@ -43,6 +43,16 @@ class Search
      */
     private $from;
 
+    /**
+     * @var string
+     */
+    private $timeout;
+
+    /**
+     * @var int
+     */
+    private $terminateAfter;
+
     /**
      * @var string|null
      */
@@ -400,6 +410,34 @@ class Search
         return $this;
     }
 
+    /**
+     * Sets timeout for query execution.
+     *
+     * @param $timeout
+     *
+     * @return $this
+     */
+    public function setTimeout($timeout)
+    {
+        $this->timeout = $timeout;
+
+        return $this;
+    }
+
+    /**
+     * Sets maximum number of documents per shard.
+     *
+     * @param $terminateAfter
+     *
+     * @return $this
+     */
+    public function setTerminateAfter($terminateAfter)
+    {
+        $this->terminateAfter = $terminateAfter;
+
+        return $this;
+    }
+
     /**
      * Returns results offset value.
      *
@@ -674,6 +712,8 @@ class Search
             'stats' => 'stats',
             'minScore' => 'min_score',
             'source' => '_source',
+            'timeout' => 'timeout',
+            'terminateAfter' => 'terminate_after',
         ];
 
         foreach ($params as $field => $param) {
diff --git a/tests/SearchTest.php b/tests/SearchTest.php
index e5a84d2..4646edb 100644
--- a/tests/SearchTest.php
+++ b/tests/SearchTest.php
@@ -25,4 +25,83 @@ class SearchTest extends \PHPUnit_Framework_TestCase
     {
         $this->assertInstanceOf('ONGR\ElasticsearchDSL\Search', new Search());
     }
+
+    /**
+     * Data provider for test testSettingParams()
+     *
+     * @return array
+     */
+    public function getTestSettingParamsData()
+    {
+        $cases = [];
+
+        $search = new Search();
+        $search->setSize(3);
+        $cases['Only size is set'] = [
+            $search,
+            [
+                'size' => 3,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setFrom(4);
+        $cases['Only from is set'] = [
+            $search,
+            [
+                'from' => 4,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setTimeout('2s');
+        $cases['Only timeout is set'] = [
+            $search,
+            [
+                'timeout' => '2s',
+            ],
+        ];
+
+        $search = new Search();
+        $search->setTerminateAfter(100);
+        $cases['Only terminate_after is set'] = [
+            $search,
+            [
+                'terminate_after' => 100,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setSize(3);
+        $search->setFrom(4);
+        $search->setTimeout('2s');
+        $search->setTerminateAfter(100);
+        $cases['Multiple parameters are set'] = [
+            $search,
+            [
+                'size' => 3,
+                'from' => 4,
+                'timeout' => '2s',
+                'terminate_after' => 100,
+            ],
+        ];
+
+        return $cases;
+    }
+
+    /**
+     * This test checks if parameters are correctly set into Search object.
+     *
+     * @dataProvider getTestSettingParamsData()
+     *
+     * @param Search    $search
+     * @param array     $expected
+     */
+    public function testSettingParams($search, $expected)
+    {
+        $this->assertEquals(
+            $expected,
+            $search->toArray()
+        );
+    }
 }
-- 
GitLab