diff --git a/composer.json b/composer.json index 50ebedcaa47fe227c9b8d307d3169e079466dde4..e23719ec03d10734cf9d4c9e0bdd19bf7c01e67a 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "require": { "php": "^7.0", "symfony/serializer": "^3.0|^4.0", - "paragonie/random_compat": "^1.0|^2.0" + "paragonie/random_compat": "*" }, "require-dev": { "elasticsearch/elasticsearch": "^6.0", diff --git a/src/Aggregation/Bucketing/DateHistogramAggregation.php b/src/Aggregation/Bucketing/DateHistogramAggregation.php index 58abbc050340ec7c95a8e10a165ce8f6a83efaec..4b1009d3d13c33fdd342f8e840837f0d6560ad9c 100644 --- a/src/Aggregation/Bucketing/DateHistogramAggregation.php +++ b/src/Aggregation/Bucketing/DateHistogramAggregation.php @@ -28,6 +28,11 @@ class DateHistogramAggregation extends AbstractAggregation */ protected $interval; + /** + * @var string + */ + protected $format; + /** * Inner aggregations container init. * @@ -35,12 +40,13 @@ class DateHistogramAggregation extends AbstractAggregation * @param string $field * @param string $interval */ - public function __construct($name, $field = null, $interval = null) + public function __construct($name, $field = null, $interval = null, $format = null) { parent::__construct($name); $this->setField($field); $this->setInterval($interval); + $this->setFormat($format); } /** @@ -59,6 +65,14 @@ class DateHistogramAggregation extends AbstractAggregation $this->interval = $interval; } + /** + * @param string $format + */ + public function setFormat($format) + { + $this->format = $format; + } + /** * {@inheritdoc} */ @@ -81,6 +95,10 @@ class DateHistogramAggregation extends AbstractAggregation 'interval' => $this->getInterval(), ]; + if (!empty($this->format)) { + $out['format'] = $this->format; + } + return $out; } } diff --git a/src/Aggregation/Bucketing/DateRangeAggregation.php b/src/Aggregation/Bucketing/DateRangeAggregation.php index d02b3d727084b14abebe2511de0500d5c1e940e8..00184c97ec202bf27ffe8a5b05560ee8c67c4ac9 100644 --- a/src/Aggregation/Bucketing/DateRangeAggregation.php +++ b/src/Aggregation/Bucketing/DateRangeAggregation.php @@ -86,7 +86,10 @@ class DateRangeAggregation extends AbstractAggregation 'from' => $from, 'to' => $to, 'key' => $key, - ] + ], + function ($v) { + return !is_null($v); + } ); if (empty($range)) { diff --git a/src/Aggregation/Bucketing/GeoDistanceAggregation.php b/src/Aggregation/Bucketing/GeoDistanceAggregation.php index 2d6a09523b2da7bdd2e1bfbb065f6b7289dae6c6..6772ea5e67cf55361aa0fc1219d31125a9de3842 100644 --- a/src/Aggregation/Bucketing/GeoDistanceAggregation.php +++ b/src/Aggregation/Bucketing/GeoDistanceAggregation.php @@ -132,7 +132,10 @@ class GeoDistanceAggregation extends AbstractAggregation [ 'from' => $from, 'to' => $to, - ] + ], + function ($v) { + return !is_null($v); + } ); if (empty($range)) { diff --git a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php index d9bcd0baacce53daea432ae8ae1de33d3b729697..0579aaf88f8f7b0076ef93e9a1d115a2066d6bf2 100644 --- a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php +++ b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php @@ -65,7 +65,10 @@ class Ipv4RangeAggregation extends AbstractAggregation [ 'from' => $from, 'to' => $to, - ] + ], + function ($v) { + return !is_null($v); + } ); $this->ranges[] = $range; diff --git a/src/Aggregation/Bucketing/RangeAggregation.php b/src/Aggregation/Bucketing/RangeAggregation.php index ab87c9955d2a03aab693773357b0b8b3b21df41e..fb7d756bbdb28e28f05e60cff198df2ca301802e 100644 --- a/src/Aggregation/Bucketing/RangeAggregation.php +++ b/src/Aggregation/Bucketing/RangeAggregation.php @@ -84,7 +84,10 @@ class RangeAggregation extends AbstractAggregation [ 'from' => $from, 'to' => $to, - ] + ], + function ($v) { + return !is_null($v); + } ); if ($this->keyed && !empty($key)) { diff --git a/src/Query/Compound/BoolQuery.php b/src/Query/Compound/BoolQuery.php index 4b30287e2d0517572730050ca02606161403d489..7bb6a8594afec39731cfc704198eb3f2f3bbc5b7 100644 --- a/src/Query/Compound/BoolQuery.php +++ b/src/Query/Compound/BoolQuery.php @@ -116,6 +116,10 @@ class BoolQuery implements BuilderInterface $output = $this->processArray($output); + if (empty($output)) { + $output = new \stdClass(); + } + return [$this->getType() => $output]; } diff --git a/src/Search.php b/src/Search.php index 5dedceaf673a441438bee994d9bbc59eb6712718..1a1b51b96472457ce38e7b77f29504dfd875f229 100644 --- a/src/Search.php +++ b/src/Search.php @@ -155,7 +155,7 @@ class Search /** * @var OrderedSerializer */ - private $serializer; + private static $serializer; /** * @var SearchEndpointInterface[] @@ -167,12 +167,14 @@ class Search */ public function __construct() { - $this->serializer = new OrderedSerializer( - [ - new CustomReferencedNormalizer(), - new CustomNormalizer(), - ] - ); + if (static::$serializer === null) { + static::$serializer = new OrderedSerializer( + [ + new CustomReferencedNormalizer(), + new CustomNormalizer(), + ] + ); + } } /** @@ -703,7 +705,7 @@ class Search */ public function toArray() { - $output = array_filter($this->serializer->normalize($this->endpoints)); + $output = array_filter(static::$serializer->normalize($this->endpoints)); $params = [ 'from' => 'from', diff --git a/tests/Unit/Query/Compound/BoolQueryTest.php b/tests/Unit/Query/Compound/BoolQueryTest.php index 4eb0417dbef94c12101951e3b3a169173b4c89c1..cc91a7b66083830a07063390d3c6b82d0471965f 100644 --- a/tests/Unit/Query/Compound/BoolQueryTest.php +++ b/tests/Unit/Query/Compound/BoolQueryTest.php @@ -69,6 +69,16 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expected, $bool->toArray()); } + /** + * Tests bool query with empty body if it forms \stdObject + */ + public function testEmptyBoolQuery() + { + $bool = new BoolQuery(); + + $this->assertEquals(['bool' => new \stdClass()], $bool->toArray()); + } + /** * Tests bool query in filter context. */