Skip to content

Commit 488b314

Browse files
authored
Merge pull request #67 from sventendo/feature/collapse-inner-hits
Collapse: Make use of nested inner hits query object
2 parents 7a25de7 + 68b4e9b commit 488b314

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

src/Builder.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Http\Promise\Promise;
88
use Spatie\ElasticsearchQueryBuilder\Aggregations\Aggregation;
99
use Spatie\ElasticsearchQueryBuilder\Queries\BoolQuery;
10+
use Spatie\ElasticsearchQueryBuilder\Queries\NestedQuery\InnerHits;
1011
use Spatie\ElasticsearchQueryBuilder\Queries\Query;
1112
use Spatie\ElasticsearchQueryBuilder\Sorts\Sorting;
1213

@@ -174,11 +175,14 @@ public function addPostFilterQuery(Query $query, string $boolType = 'must'): sta
174175
return $this;
175176
}
176177

177-
public function collapse(string $field, ?array $innerHits = null, ?int $maxConcurrentGroupRequests = null): static
178+
public function collapse(string $field, array|InnerHits|null $innerHits = null, ?int $maxConcurrentGroupRequests = null): static
178179
{
179180
$this->collapse = ['field' => $field];
180181

181182
if ($innerHits) {
183+
if ($innerHits instanceof InnerHits) {
184+
$innerHits = $innerHits->toArray();
185+
}
182186
$this->collapse['inner_hits'] = $innerHits;
183187
}
184188

tests/Builders/BuilderTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
namespace Spatie\ElasticsearchQueryBuilder\Tests\Builders;
4+
5+
use Elastic\Elasticsearch\Client;
6+
use Elastic\Transport\TransportBuilder;
7+
use PHPUnit\Framework\TestCase;
8+
use Psr\Log\LoggerInterface;
9+
use Spatie\ElasticsearchQueryBuilder\Builder;
10+
use Spatie\ElasticsearchQueryBuilder\Queries\NestedQuery\InnerHits;
11+
use Spatie\ElasticsearchQueryBuilder\Sorts\Sort;
12+
13+
class BuilderTest extends TestCase
14+
{
15+
protected Client $client;
16+
17+
public function setUp(): void
18+
{
19+
$transport = TransportBuilder::create()
20+
->setClient(new \Http\Mock\Client())
21+
->build();
22+
23+
$logger = $this->createStub(LoggerInterface::class);
24+
25+
$this->client = new Client($transport, $logger);
26+
}
27+
28+
public function testGeneratesCollapseWithPlainArrayData(): void
29+
{
30+
$innerHits = [
31+
'name' => 'first_group',
32+
'size' => 1,
33+
'sort' => [
34+
[ 'name.keyword' => [ 'order' => 'asc' ] ],
35+
],
36+
];
37+
38+
$builder = (new Builder($this->client))
39+
->collapse('group_id', $innerHits);
40+
41+
self::assertEquals(
42+
[ 'collapse' => [ 'field' => 'group_id', 'inner_hits' => $innerHits ] ],
43+
$builder->getPayload()
44+
);
45+
}
46+
47+
public function testGeneratesCollapseWithInnerHitsObject(): void
48+
{
49+
$innerHits = InnerHits::create('first_group')
50+
->size(1)
51+
->addSort(new Sort('name.keyword', 'asc'));
52+
53+
$builder = (new Builder($this->client))
54+
->collapse('group_id', $innerHits);
55+
56+
self::assertEquals(
57+
[
58+
'collapse' => [
59+
'field' => 'group_id', 'inner_hits' => [
60+
'name' => 'first_group',
61+
'size' => 1,
62+
'sort' => [
63+
[
64+
'name.keyword' => [
65+
'order' => 'asc',
66+
],
67+
],
68+
],
69+
],
70+
],
71+
],
72+
$builder->getPayload()
73+
);
74+
}
75+
}

0 commit comments

Comments
 (0)