From b18e3f6351cafca6d399c14c2a89df74f94b7e80 Mon Sep 17 00:00:00 2001 From: Mantas Varatiejus <mantas.varatiejus@nfq.com> Date: Fri, 18 Dec 2015 15:19:31 +0200 Subject: [PATCH] Add filter type for BoolQuery --- src/Query/BoolQuery.php | 13 ++++++++----- tests/Query/BoolQueryTest.php | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/Query/BoolQuery.php b/src/Query/BoolQuery.php index 924ee6c..05518bf 100644 --- a/src/Query/BoolQuery.php +++ b/src/Query/BoolQuery.php @@ -17,7 +17,7 @@ use ONGR\ElasticsearchDSL\ParametersTrait; /** * Represents Elasticsearch "bool" query. * - * @link http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html + * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html */ class BoolQuery implements BuilderInterface { @@ -26,6 +26,7 @@ class BoolQuery implements BuilderInterface const MUST = 'must'; const MUST_NOT = 'must_not'; const SHOULD = 'should'; + const FILTER = 'filter'; /** * @var array @@ -41,6 +42,7 @@ class BoolQuery implements BuilderInterface self::MUST => [], self::MUST_NOT => [], self::SHOULD => [], + self::FILTER => [], ]; } @@ -52,8 +54,8 @@ class BoolQuery implements BuilderInterface public function isRelevant() { return - (count($this->container[self::MUST_NOT]) + count($this->container[self::SHOULD])) > 0 - || count($this->container[self::MUST]) > 1; + count($this->container[self::MUST]) > 1 || count($this->container[self::MUST_NOT]) || + count($this->container[self::SHOULD]) || count($this->container[self::FILTER]); } /** @@ -66,7 +68,8 @@ class BoolQuery implements BuilderInterface return array_merge( $this->container[self::MUST], $this->container[self::MUST_NOT], - $this->container[self::SHOULD] + $this->container[self::SHOULD], + $this->container[self::FILTER] ); } @@ -86,7 +89,7 @@ class BoolQuery implements BuilderInterface */ public function add(BuilderInterface $query, $type = self::MUST, $key = null) { - if (!in_array($type, (new \ReflectionObject($this))->getConstants())) { + if (!in_array($type, [self::MUST, self::MUST_NOT, self::SHOULD, self::FILTER])) { throw new \UnexpectedValueException(sprintf('The bool operator %s is not supported', $type)); } diff --git a/tests/Query/BoolQueryTest.php b/tests/Query/BoolQueryTest.php index 4505857..b4fb95c 100644 --- a/tests/Query/BoolQueryTest.php +++ b/tests/Query/BoolQueryTest.php @@ -113,4 +113,31 @@ class BoolQueryTest extends \PHPUnit_Framework_TestCase $result = $bool->getType(); $this->assertEquals('bool', $result); } + + /** + * Tests bool query in filter context. + */ + public function testBoolInFilterContext() + { + $bool = new BoolQuery(); + $bool->add(new TermQuery('key1', 'value1'), BoolQuery::FILTER); + $bool->add(new TermQuery('key2', 'value2'), BoolQuery::MUST); + $expected = [ + 'filter' => [ + [ + 'term' => [ + 'key1' => 'value1', + ], + ], + ], + 'must' => [ + [ + 'term' => [ + 'key2' => 'value2', + ], + ], + ], + ]; + $this->assertEquals($expected, $bool->toArray()); + } } -- GitLab