Skip to content

Commit d9248d5

Browse files
authored
Merge pull request #113 from fedorf4/v7-add-reverse-nested
V7 add reverse nested aggregation
2 parents 379a152 + 1e3e8f7 commit d9248d5

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Aggregating\Bucket;
4+
5+
use Ensi\LaravelElasticQuery\Aggregating\AggregationCollection;
6+
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
7+
use Webmozart\Assert\Assert;
8+
9+
class ReverseNestedAggregation implements Aggregation
10+
{
11+
public function __construct(
12+
private string $name,
13+
private AggregationCollection $children
14+
) {
15+
Assert::stringNotEmpty(trim($name));
16+
}
17+
18+
public function name(): string
19+
{
20+
return $this->name;
21+
}
22+
23+
public function toDSL(): array
24+
{
25+
return [$this->name => [
26+
'reverse_nested' => new \stdClass(),
27+
'aggs' => $this->children->toDSL(),
28+
]];
29+
}
30+
31+
public function parseResults(array $response): array
32+
{
33+
return $this->children
34+
->parseResults($response[$this->name] ?? [])
35+
->all();
36+
}
37+
}

tests/IntegrationTests/AggregationQueryIntegrationTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
use Ensi\LaravelElasticQuery\Aggregating\AggregationCollection;
44
use Ensi\LaravelElasticQuery\Aggregating\Bucket;
5+
use Ensi\LaravelElasticQuery\Aggregating\Bucket\ReverseNestedAggregation;
56
use Ensi\LaravelElasticQuery\Aggregating\FiltersCollection;
7+
use Ensi\LaravelElasticQuery\Aggregating\Metrics\CardinalityAggregation;
68
use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxScoreAggregation;
79
use Ensi\LaravelElasticQuery\Aggregating\Metrics\ScriptAggregation;
810
use Ensi\LaravelElasticQuery\Aggregating\Metrics\TopHitsAggregation;
@@ -263,3 +265,42 @@
263265
$scores,
264266
);
265267
});
268+
269+
test('reverse nested aggregation with specific data', function () {
270+
/** @var IntegrationTestCase $this */
271+
272+
$results = ProductsIndex::aggregate()
273+
->where('active', true)
274+
->nested('offers', function ($builder) {
275+
$reverseAggs = new AggregationCollection();
276+
$reverseAggs->add(new CardinalityAggregation(
277+
'product_id',
278+
'product_id'
279+
));
280+
$reverseNested = new ReverseNestedAggregation('product_info', $reverseAggs);
281+
282+
$compositeAggs = new AggregationCollection();
283+
$compositeAggs->add($reverseNested);
284+
285+
$builder->terms('sellers', 'seller_id', 10, composite: $compositeAggs);
286+
})
287+
->get();
288+
289+
$sellers = $results->get('sellers');
290+
291+
$seller10Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 10);
292+
expect($seller10Bucket)->not->toBeNull();
293+
expect($seller10Bucket->getCompositeValue('product_id'))->toBe(3);
294+
295+
$seller15Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 15);
296+
expect($seller15Bucket)->not->toBeNull();
297+
expect($seller15Bucket->getCompositeValue('product_id'))->toBe(3);
298+
299+
$seller20Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 20);
300+
expect($seller20Bucket)->not->toBeNull();
301+
expect($seller20Bucket->getCompositeValue('product_id'))->toBe(3);
302+
303+
$seller90Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 90);
304+
expect($seller90Bucket)->not->toBeNull();
305+
expect($seller90Bucket->getCompositeValue('product_id'))->toBe(1);
306+
});

0 commit comments

Comments
 (0)